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