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

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

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

我只是不知道如何在不让每个请求都经过 PHP 脚本的情况下限制访问。有没有办法让 Apache 检查会话凭据并限制访问,如 Basic Auth?

答案1

除非您更改了设置,否则 PHP 会话数据会以其自己的 serialize() 格式的变体存储在临时目录中,如果不使用 PHP 本身就很难获取这些数据。

不幸的是,您似乎想要静态文件的速度,同时动态授权每个请求,这实际上并不是兼容的目标。您可能会妥协,使用一个超轻量级的 PHP 脚本,然后使用 mod_rewrite 重写对其中文件的请求,这样就可以了。非常简单的例子:

.htaccess 文件:

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

身份验证.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。

这些都未经测试,但我认为这大致是你必须走的方向。

参考:

答案2

我解决这个问题的计划是

  1. 将请求重定向到 PHP

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

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

答案3

如果您有一个可以期待的特定 cookie,那么您可以使用 mod_rewrite 测试它是否不存在并给出 403 Forbidden。

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

但是,如果有人知道他们需要设置“LoggedIn=true”的 cookie,那么他们就可以轻松绕过您的“保护”。

PHP 会话特定于 PHP。Apache 无法在 PHP 会话中使用任何信息。您必须拥有一些专门用于执行会话验证的身份验证模块。

我看到大多数人所做的是使用 PHP 脚本来处理静态内容的服务,它获取请求、验证会话、读取文件并使用适当的 MIME 信息发送内容。

答案4

如果您使用 mod_php,则对 Basic Auth 回答“是”。http://php.net/manual/en/features.http-auth.php

相关内容