除非某个条件为真,否则拒绝所有通过http访问文件

时间:2010-10-07 23:47:46

标签: php security apache

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

我在想,如果我通过PHP使用chmod更改文件对经过验证的用户的权限,并在连接关闭时让它们更改它可以工作,但是如果有并发连接那么连接后的用户会无论它们是否有效,都具有完全访问权限,实际上可以绕过验证。也许有更好的方法可以这样做。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

将您的文件放入目录并通过.htaccess停用http访问。然后编写一个检查该条件的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>

答案 1 :(得分:0)

这实际上取决于你正在检查的“条件”,但是你不需要乱用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 */
}