阻止通过 http 直接访问文件,但允许 php 脚本访问
Posted
技术标签:
【中文标题】阻止通过 http 直接访问文件,但允许 php 脚本访问【英文标题】:Block direct access to a file over http but allow php script access 【发布时间】:2011-02-10 09:26:20 【问题描述】:我正在将我的文件(pdf、doc、flv 等)加载到缓冲区中,并通过脚本将它们提供给我的用户。我需要我的脚本能够访问该文件,但不允许直接访问它。实现这一目标的最佳方法是什么?我应该使用我的权限做某事还是使用 .htaccess 锁定目录?
【问题讨论】:
看看这个***.com/q/43951871/2441637 【参考方案1】:最安全的方法是将您想要保留的文件放在网络根目录之外,就像 Damien 建议的那样。这是因为 Web 服务器遵循本地文件系统权限,而不是它自己的权限。
但是,有很多托管公司只允许您访问网络根目录。为了仍然阻止对文件的 HTTP 请求,请将它们自己放入一个目录中,并带有一个阻止所有通信的 .htaccess 文件。例如,
Order deny,allow
Deny from all
您的网络服务器以及您的服务器端语言仍然能够读取它们,因为目录的本地权限允许网络服务器读取和执行文件。
【讨论】:
我在音频文件夹中使用了这个,但它正在阻止我的音频播放器播放音频。我正在使用声音管理器 2 播放音频。是否有任何解决方法只允许声音管理器播放该音频文件但停止任何其他直接访问? @sonill - 您可以将某些 IP 列入白名单,以便能够访问这些目录。例如,添加带有Allow from 127.0.0.1
的新行将允许您的服务器(包括任何服务器端代码)访问该目录中的文件。有关这些位的更多文档,请访问httpd.apache.org/docs/2.4/mod/mod_access_compat.html#allow
“但是,有很多托管公司只允许您访问 Web 根目录。”为什么那些公司不能把 web root 比 FTP root 低一级呢?他们对 php 的工作原理是零了解(或者更可能是疏忽)还是只关心自己的安全和金钱?哦,好吧,只需选择一家真正关心您网站安全的公司。
我试过了,但下载后无法打开文件:打开流失败:HTTP 请求失败! HTTP/1.1 403 禁止
当我们尝试从 php 脚本访问时不起作用。您有任何代码如何访问该文件【参考方案2】:
基于自定义模块的 .htaccess 脚本(就像在 CodeIgniter 中使用的那样)怎么样?我试过了,它在 CodeIgniter 应用程序中运行良好。有什么想法可以在其他应用上使用它吗?
<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>
【讨论】:
【参考方案3】:为了防止 .ini 文件从 Web 访问,请将以下内容放入 apache2.conf 中
<Files ~ "\.ini$">
Order allow,deny
Deny from all
</Files>
【讨论】:
【参考方案4】:在 httpd.conf 中阻止浏览器和 wget 访问包含文件,尤其是 db.inc 或 config.inc 。请注意,您不能在指令中链接文件类型,而是创建多个文件指令。
<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>
在重启 apache 之前测试你的配置
service httpd configtest
然后(优雅重启)
service httpd graceful
【讨论】:
【参考方案5】:如果您有权访问您的 httpd.conf 文件(在 ubuntu 中它位于 /etc/apache2 目录中),您应该添加与特定目录中的 .htaccess
文件相同的行。那就是(例如):
ServerName YOURSERVERNAMEHERE
<Directory /var/www/>
AllowOverride None
order deny,allow
Options -Indexes FollowSymLinks
</Directory>
对您想要控制信息的每个目录执行此操作,您将在一个位置拥有一个文件来管理所有访问。在上面的例子中,我是在根目录 /var/www 上做的。
此选项可能不适用于外包托管,尤其是共享托管。但这比添加许多 .htaccess
文件更好。
【讨论】:
【参考方案6】:这就是我阻止从 URL 直接访问我的 ini 文件的方式。将以下代码粘贴到根目录下的.htaccess
文件中。 (无需创建额外的文件夹)
<Files ~ "\.ini$">
Order allow,deny
Deny from all
</Files>
我的settings.ini
文件位于根目录下,没有此代码可访问 www.mydomain.com/settings.ini
【讨论】:
【参考方案7】:文件与 PHP 脚本是否在同一台服务器上?如果是这样,只需将文件保留在 Web 根目录之外,并确保您的 PHP 脚本对它们的存储位置具有读取权限。
【讨论】:
以上是关于阻止通过 http 直接访问文件,但允许 php 脚本访问的主要内容,如果未能解决你的问题,请参考以下文章
PHP:如何阻止对文件的直接 URL 访问,但仍允许登录用户下载它?
如何拒绝直接访问网站文件但允许网站文件通过包含'file.php'相互访问?