我有一个使用 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
我解决这个问题的计划是
将请求重定向到 PHP
RewriteEngine on RewriteRule ([0-9a-z-_]+)$ authenticateUser.php?&file=$1 [L]
使用 PHP 对用户进行身份验证(其他所有身份验证方法可能都太弱或需要一直写入文件)
if ( User::hasPermission() && isSane( $filePath ) ) { // header( 'X-Sendfile: ' . $filePath ); }
使用 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