如何使用PHP会话在Apache中保护目录

我有一个使用PHP会话进行身份validation的站点。 有一个目录,我想限制访问,不使用任何PHP,它只是充满了静态内容。

我只是不知道如何限制访问没有通过PHP脚本的每个请求。 有没有办法让Apache检查会话凭证并限制访问像基本身份validation?

除非您更改了设置,否则PHP会话数据将以自己的serialize()格式存储在一个临时目录中,如果不使用PHP本身就不容易。

不幸的是,你似乎想要dynamic授权每个请求的静态服务文件的速度,这不是真正的兼容目标。 你可以通过一个超级轻量级​​的PHP脚本进行comprimise,然后使用mod_rewrite来重写对其中的文件的请求,通过一些很好的事情。 超级简单的例子:

的.htaccess:

RewriteEngine On RewriteMap auth prg:auth.php RewriteRule (.*) ${auth:$1} 

auth.php:

 #!/usr/bin/php <?PHP set_time_limit(0); # This program needs to run forever. $stdin = fopen("php://stdin","r"); # Keeps reading from standard in while (true) { $line = trim(fgets($stdin)); if (isset($_SESSION['USER_LOGGED_IN'])) { echo $line\n"; } else { echo "authfailed.html\n"; } } 

值得注意的是,PHP脚本是永远运行,所以你需要重新启动Apache,如果你改变它,我想。

这一切都没有经过testing,但这大致是我认为你必须进入的方向。

参考文献:

如果你有一个特定的cookie,那么你可以使用mod_rewritetesting它的缺失,并给出一个403 Forbidden。

RewriteCond %{HTTP_COOKIE} !LoggedIn=true
RewriteRule .* - [F,L]

但是,如果有人知道他们需要一个“LoggedIn = true”的cookie,那么他们可以很容易地绕过你的“保护”。

PHP会话特定于PHP。 Apache无法在PHP会话中使用任何信息。 您将不得不具有一些专门用于进行会话validation的validation模块。

我见过的大多数人所做的就是让PHP脚本处理静态内容的提供,因为它获取请求,validation会话,读取文件并使用适当的MIME信息发送内容。

这个问题的传统解决scheme是将该文件夹的每个调用redirect到一个php文件,该文件检查用户的权限,然后读取该文件,并将其发送到输出stream或将用户redirect到“no permission”现场。 例如…

保护文件的另一个棘手的方法是从session_id和静态salt(并从静态文件path中select)生成一个令牌,并通过文件访问来检查它。 所以你必须在你的htaccess文件中重新生成这个标记。 我不知道是否只能使用.htaccess,或者你必须使用PHP。 我在这里find类似的解决scheme。 我99%相信,MD5是不是内置的mod重写function。

我现在要解决这个问题的计划

  1. 将请求redirect到PHP

     RewriteEngine on RewriteRule ([0-9a-z-_]+)$ authenticateUser.php?&file=$1 [L] 
  2. 使用PHP对用户进行身份validation(所有其他身份validation方法可能太弱或需要一直写入文件)

     if ( User::hasPermission() && isSane( $filePath ) ) { // header( 'X-Sendfile: ' . $filePath ); } 
  3. 使用Apache的mod_xsendfile ( docs , github )

是的,以基本authentication,如果你使用mod_php。 http://php.net/manual/en/features.http-auth.php