【问题标题】:Protecting certain files and folders from view within a public folder保护公共文件夹中的某些文件和文件夹不被查看
【发布时间】:2014-09-03 04:56:45
【问题描述】:

今天我已经为此苦苦挣扎了一段时间。 我想要完成的是我需要阻止所有用户访问某些 php 文件和图像以及更多内容(它们位于单独的文件夹中)。

我正在使用 WAMP 服务器。

我不希望用户只能访问那个站点,例如“www/images/crazy-cat-picture.jpg”(或者更像是“www/phpScripts/sign-up-user.php” ) 但我仍然希望用户能够在我的网站上看到图片并调用 php 脚本。

我尝试了 3 种不同的方法,但都没有奏效。

1:将文件夹放在www目录之外

这不起作用,因为 php 和 html 页面找不到数据,它根本不会显示它。

2: .htaccess 文件,我在其中写了这个:

Deny from all
Allow from 127.0.0.1
Allow from 192.168

这不起作用,因为它完全阻止了访问,并且用户即使在单独的网站上也无法查看内容。

3: .htaccess 文件,我在其中写了这个:

IndexIgnore *

这将删除标准,而不是显示文件夹,而是将用户放置到 index.php,然后我将此文件重定向到错误 403 页面,这很好用。 但这里的问题是,如果用户拥有完整的路径,仍然可以访问数据,例如“www/images/crazy-cat-picture.jpg”

然后我一直在考虑在我所有的 php 脚本文件和用户上传的图片上创建复杂的名称,这将很难找到图片和文件。但我想知道是否没有更好的方法来做到这一点,例如如果用户没有从我的网站调用它,则阻止特定文件夹中的所有内容。

问题是:有人知道我怎样才能使在文件夹中找不到内容,但仍使用户能够在我的网站上使用它吗?

很抱歉把这篇文章写得这么长,但我希望有人可以回答我的问题。 谢谢!

【问题讨论】:

  • 对于 php 文件,您可以在每个文件夹中创建空的 index.html 文件。但是对于图像,您不能做任何事情,因为您网站中可用的所有图像都是由客户端下载的。
  • 有几种方法,最简单的方法是检查引荐来源网址是否设置,但有些用户将浏览器设置为不填充引荐来源网址。另一种是使用 php 加载文件,然后您可以在加载图像的页面上设置 CSRF 令牌之类的操作,另一种方法是使用 cookie 等,但最终 这一切都是徒劳的 因为如果有人想要它,那么除了您没有真正公开首先显示图像之外,没有什么能阻止他们。它对于任何资源、图像、视频、音乐都是一样的,否则浏览器将无法下载并显示它。祝你好运
  • 您是要保护文件夹还是某些文件?
  • @user3810556 检查我的答案,让我知道它是否适合你,因为我不确定 Apache 如何在 Windows 上运行 :)
  • @LozCheroneツ 感谢大家的回答,现在我知道如果您能够通过网站访问这些文件,您必须能够单独访问这些文件。我想我不需要保护它们免受单独访问它们的用户的影响,因为每个人都可以从网站访问它们,那么我只需将限制编码到文件中,并且图像总是可以以某种方式访问​​,如果它们被加载到您的网站中。感谢您的快速回答:)

标签: php html apache .htaccess


【解决方案1】:

仅保护某些文件和文件夹

1st solution

下一个示例展示了如何保护两个 .php 文件、两个文件夹和两个 .jpg 图像。其他一切都应该保持可访问性。

Create an .htaccess file 并将其放在受保护资产所在的文件夹中

# .htaccess
<FilesMatch ^((001|002)\.php$|folder-001|folder-002|(image-001|image-002)\.jpg)$>
    AuthUserFile /absolute-path-to-the-password-file/.htpasswd
    AuthName "Private Area"
    AuthType Basic
    Require valid-user
</FilesMatch>

然后创建一个加密密码 - 使用这个网站htpasswd generator

Create an .htpasswd 并将其放在您的 public_html 文件夹之外。它包含从上述服务生成的用户名和密码。

# .htpasswd
username:j9mKJ6TCrsbSk

如您所见,以上文件将受密码保护

2nd solution

你也可以使用下一个解决方案

# .htaccess
<FilesMatch ^((001|002)\.php$|folder-001|folder-002|(image-001|image-002)\.jpg)$>
    Deny from all
</FilesMatch>

此解决方案不需要 .htpasswd 部分,但任何人都无法访问 FilesMatch 指令中列出的文件。


在 Debian 7 / Apache 2 上测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多