【发布时间】:2011-02-10 09:26:20
【问题描述】:
我正在将我的文件(pdf、doc、flv 等)加载到缓冲区中,并通过脚本将它们提供给我的用户。我需要我的脚本能够访问该文件,但不允许直接访问它。实现这一目标的最佳方法是什么?我应该使用我的权限做某事还是使用 .htaccess 锁定目录?
【问题讨论】:
标签: php apache permissions
我正在将我的文件(pdf、doc、flv 等)加载到缓冲区中,并通过脚本将它们提供给我的用户。我需要我的脚本能够访问该文件,但不允许直接访问它。实现这一目标的最佳方法是什么?我应该使用我的权限做某事还是使用 .htaccess 锁定目录?
【问题讨论】:
标签: php apache permissions
最安全的方法是将您想要保留的文件放在网络根目录之外,就像 Damien 建议的那样。这是因为 Web 服务器遵循本地文件系统权限,而不是它自己的权限。
但是,有很多托管公司只允许您访问网络根目录。为了仍然阻止对文件的 HTTP 请求,请将它们自己放入一个目录中,并带有一个阻止所有通信的 .htaccess 文件。例如,
Order deny,allow
Deny from all
您的网络服务器以及您的服务器端语言仍然能够读取它们,因为目录的本地权限允许网络服务器读取和执行文件。
【讨论】:
Allow from 127.0.0.1 的新行将允许您的服务器(包括任何服务器端代码)访问该目录中的文件。有关这些位的更多文档,请访问httpd.apache.org/docs/2.4/mod/mod_access_compat.html#allow
基于自定义模块的 .htaccess 脚本(就像在 CodeIgniter 中使用的那样)怎么样?我试过了,它在 CodeIgniter 应用程序中运行良好。有什么想法可以在其他应用上使用它吗?
<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>
【讨论】:
为了防止 .ini 文件从 Web 访问,请将以下内容放入 apache2.conf 中
<Files ~ "\.ini$">
Order allow,deny
Deny from all
</Files>
【讨论】:
在 httpd.conf 中阻止浏览器和 wget 访问包含文件,尤其是 db.inc 或 config.inc 。请注意,您不能在指令中链接文件类型,而是创建多个文件指令。
<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>
在重启 apache 之前测试你的配置
service httpd configtest
然后(优雅重启)
service httpd graceful
【讨论】:
如果您有权访问您的 httpd.conf 文件(在 ubuntu 中它位于 /etc/apache2 目录中),您应该添加与特定目录中的 .htaccess 文件相同的行。那就是(例如):
ServerName YOURSERVERNAMEHERE
<Directory /var/www/>
AllowOverride None
order deny,allow
Options -Indexes FollowSymLinks
</Directory>
对您想要控制信息的每个目录执行此操作,您将在一个位置拥有一个文件来管理所有访问。在上面的例子中,我是在根目录 /var/www 上做的。
此选项可能不适用于外包托管,尤其是共享托管。但这比添加许多 .htaccess 文件更好。
【讨论】:
这就是我阻止从 URL 直接访问我的 ini 文件的方式。将以下代码粘贴到根目录下的.htaccess 文件中。 (无需创建额外的文件夹)
<Files ~ "\.ini$">
Order allow,deny
Deny from all
</Files>
我的settings.ini 文件位于根目录下,没有此代码可访问 www.mydomain.com/settings.ini
【讨论】:
文件与 PHP 脚本是否在同一台服务器上?如果是这样,只需将文件保留在 Web 根目录之外,并确保您的 PHP 脚本对它们的存储位置具有读取权限。
【讨论】: