拒绝通过HTTP访问所有的文件,除非

问题描述:

我创建一个PHP应用程序,我有一点很难找到对我有一个问题的解决方案在一定条件为真。我需要以某种方式完全拒绝任何人通过HTTP访问任何试图访问Web服务器上的文件(可能通过返回403 Forbidden错误或其他)的人,除非某些条件为真,这种情况将在每个连接的基础上进行检查。我需要找到最好的方法来做到这一点,我猜我需要在Apache中设置一些特殊的设置,我可以使用PHP进行修改,但这些Apache设置显然可以通过PHP进行配置。正如你所猜测的,我可以很好地编写PHP,但对于高级Apache配置没有经验。拒绝通过HTTP访问所有的文件,除非

我在想,也许如果我通过PHP使用chmod来更改验证用户的文件权限,并在连接关闭时让它们变回原位,但如果存在并发连接,则用户连接后缀无论它们是否有效,都将具有完全访问权限,但实际上可能只是绕过验证。但是,也许有更好的方法来做到这一点。

非常感谢您的帮助!

+4

你说的是什么样的条件? – 2010-10-07 23:52:22

将您的文件放入目录并通过.htaccess停用http访问。然后写一个PHP脚本,检验条件,如果这是真的,那么通过PHP返回请求的文件是这样的:

<?php 
define(DIR, "save_folder/"); 
$filename='the_file_to_show.pdf'; 
$fileextension= explode(".", $filename); 
header("Content-type: application/$fileextension[1]"); 
header("Content-Disposition: attachment; filename=".$filename.""); 
header("Content-Length: ".filesize(DIR.$filename)); 
readfile(DIR.$filename); 
?> 

要把它放到你的.htaccess

<Directory ~ "save_folder"> 
    Order allow,deny 
    Deny from all 
</Directory> 
+0

有趣的是,这与我的代码看起来有多相似:D我想知道如果你能用.htaccess代码来帮助我更多。我尝试了RewriteRule ^(。*)$ - [F]'上的RewriteEngine,但是如果直接访问它们(至少使用谷歌浏览器),我仍然可以下载这些文件。我该怎么做? – 2010-10-08 00:33:01

+0

只是编辑了我的答案,并附上了.htaccess – ITroubs 2010-10-08 00:39:37

+0

@Ben的相关代码,如果您想告诉我们您正在谈论的是什么情况,有人甚至可能会为此提供一个.htaccess解决方案。 – 2010-10-08 00:46:06

这真的取决于“条件”,你要检查,但你不需要乱使用chmod。如果“条件”都与HTTP请求本身有关(即,根据请求的文件,查询字符串,IP地址访问等发送文件),那么您可以严格执行此操作.htaccess

<IfModule mod_rewrite.c> 
RewriteEngine On 
Rewrite Base/

RewriteCondition {...} 
RewriteRule (.*) - [F] 
</IfModule> 

这将重定向到一个“禁止”头,如果他们匹配{...}规定的条件。见This resource for some examples

如果您需要更多的控制,或者如果您想根据更具体的(对于实例 - 发送一个403错误,如果他们还没有登录)的东西,拒绝文件,那么你要重定向到一个PHP脚本。

.htaccess: 
<IfModule mod_rewrite.c> 
RewriteEngine On 
Rewrite Base/

RewriteRule (.*) parse.php 
</IfModule> 

parse.php: 
if({conditions}){ 
    header("HTTP/1.0 403 Forbidden"); // 403 error! 
} else { 
    /* include() the file if it's PHP, otherwise just echo the file contents */ 
}