阻止直接通过http访问文件,但允许php脚本访问。

77

我正在将我的文件(pdf、doc、flv等)加载到缓冲区,并使用脚本将它们提供给我的用户。 我需要让我的脚本能够访问该文件,但不允许直接访问该文件。 什么是实现这一点的最佳方法? 我应该在权限方面做些什么,还是使用 .htaccess 锁定目录?


请看这个链接:https://dev59.com/O6Hia4cB1Zd3GeqPXraF - Hasan A Yousef
7个回答

98

最安全的方法是像Damien建议的那样,将你想要保留给自己的文件放在网站根目录之外的位置。这种方式可行是因为Web服务器遵循本地文件系统权限而不是自身权限。

然而,有很多托管公司只提供对网站根目录的访问权限。为了防止HTTP请求访问这些文件,可以将它们放入一个独立的目录中,并使用带有阻止所有通信的.htaccess文件。例如:

Order deny,allow
Deny from all

由于目录的本地权限允许Web服务器读取和执行文件,因此您的Web服务器及其服务器端语言仍然可以读取它们。


我已经在音频文件夹中使用了这个,但它停止了我的音频播放器播放音频。我正在使用Sound Manager 2来播放音频。有没有解决方法只允许声音管理器播放该音频文件,但阻止任何其他直接访问? - sonill
5
你可以将特定的IP地址加入白名单,以便能够访问这些目录。例如,添加一行新内容 Allow from 127.0.0.1 将允许你的服务器(包括任何服务器端代码)访问该目录中的文件。更多关于这些内容的文档可在 http://httpd.apache.org/docs/2.4/mod/mod_access_compat.html#allow 找到。 - Sam Bisbee
1
然而,有很多托管公司只允许您访问Web根目录。为什么这些公司不能将Web根目录放在FTP根目录的下一级?他们是否完全不了解PHP的工作原理(或者更可能是疏忽大意),还是只关心自己的安全和金钱?好吧,选择一个真正关心您网站安全的公司吧。 - FluorescentGreen5
1
我尝试了这个,但是在文件下载后无法打开它们:无法打开流:HTTP请求失败!HTTP/1.1 403 Forbidden - zylo
2
当我们尝试从PHP脚本访问时无法工作。你有任何代码可以访问那个文件吗? - Mukesh Panchal
显示剩余4条评论

36

这就是我如何防止从URL直接访问我的ini文件。将以下代码粘贴到根目录下的.htaccess文件中即可。(无需创建额外的文件夹)

<Files ~ "\.ini$">
  Order allow,deny
  Deny from all
</Files>

我的settings.ini文件在根目录下,如果没有以下代码,它会被公开访问:www.mydomain.com/settings.ini。


3
在 httpd.conf 中,为了阻止浏览器和 wget 访问包含文件,特别是 db.inc 或 config.inc,请使用以下方法。请注意,您不能在指令中链接文件类型,而应该创建多个文件指令。
<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>

在重新启动apache之前测试您的配置

service httpd configtest

然后(优雅重启)
service httpd graceful

2

这些文件是否和PHP脚本在同一台服务器上?如果是的话,只需将文件放置在网站根目录之外,并确保您的PHP脚本对它们存储的位置具有读取权限即可。


1
为了防止 .ini 文件被 Web 访问,请将以下内容放入 apache2.conf 文件中。
<Files ~ "\.ini$">
Order allow,deny
Deny from all
</Files>

1
如果您可以访问httpd.conf文件(在Ubuntu中,它位于/etc/apache2目录中),则应将与特定目录中的.htaccess文件相同的行添加到其中。例如:
ServerName YOURSERVERNAMEHERE
<Directory /var/www/>
AllowOverride None
order deny,allow
Options -Indexes FollowSymLinks
</Directory>

对于每个您想要控制信息的目录,请执行此操作,这样您将在一个位置拥有一个文件来管理所有访问权限。在上面的示例中,我为根目录 /var/www 进行了操作。
这个选项可能在外包托管中不可用,特别是共享托管。但与添加许多 .htaccess 文件相比,这是一个更好的选择。

0

如何使用基于自定义模块的.htaccess脚本(例如在CodeIgniter中使用的方式)?我尝试过并且在CodeIgniter应用程序中运行良好。有没有想法可以将其用于其他应用程序?

<IfModule authz_core_module>
    Require all denied
</IfModule>
<IfModule !authz_core_module>
    Deny from all
</IfModule>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接