使用PHP限制对登录用户的内容访问

Luk*_*uke 6 php mysql apache authentication session

我有一个LAMP设置,我只是希望能够保护网页上的内容(图像,CSS,视频等),以便只有登录的用户才能访问它.

我意识到我可以使用.htaccess轻松完成这项工作.但是我不想使用身份验证弹出窗口,我希望能够使用会话并且还能够注销.

我正在使用php来完成使用mysql进行身份验证并创建会话.这非常有效.但仍然可以访问图像,CSS,JavaScript等.

仅当存在有效的php会话时,如何才允许访问内容?

我遇到过使用mod_rewrite将文件转发到php文件(比如auth.php?file = ...)并在那里进行会话检查.对于已经检查过的页面中的每个图像,检查会话似乎效率低下.这似乎是一个黑客,我一直认为有一个更清洁的方式来做到这一点.

是否有像mod_session_cookie这样的apache的mod可以检查我的会话数据库中是否存在具有会话密钥的cookie,如果是,则为目录设置Allow all?

或者,是否可以使用mod_auth_mysql,但也能够使用PHP表单而不是身份验证弹出窗口使用会话和登录?

编辑:

这是我解决问题的方法:

在我的apache配置文件(不是.htaccess)中,我添加了:

RewriteLock /var/www/lib/rewrite.lock

<VirtualHost>
    #...
    RewriteEngine on
    RewriteMap sessionValid prg:/var/www/lib/allow.php

    <Directory /var/www/client/*>
            RewriteEngine on

            RewriteCond %{HTTP_COOKIE} !client-cookie=([^;]+)
            RewriteRule .* - [L,R=403]

            RewriteCond %{HTTP_COOKIE} client-cookie=([^;]+)
            RewriteCond ${sessionValid:%1} !valid
            RewriteRule .* - [L,R=403]
    </Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

脚本allow.php:

#!/usr/bin/php5
<?php
set_time_limit(0);

echo ""; 
$stdin = fopen("php://stdin","r");
$db = mysql_connect(...);  
mysql_select_db(..., $db);
$querypre = "SELECT ID FROM Sessions WHERE ID='";

while (1) {
  $line = trim(fgets($stdin));

  $query = $querypre.mysql_real_escape_string($line)."'";
  $result = mysql_query($query);

  if (mysql_num_rows($result) > 0)
    echo("valid\n");
  else
    echo("0\n");
}

mysql_close($db);
?>
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力.使用this和session_set_save_handler我能够使用mysql支持的php会话来保护php页面和其中的所有内容.我希望有人觉得这很有用.

一些警告:

  • 如果要在虚拟主机内部使用它,则需要在虚拟主机块内定义RewriteMap语句.将它放在块外面是行不通的.
  • 您必须在定义RewriteMap之前设置RewriteEngine,否则它将被忽略.
  • RewriteLock不能位于虚拟主机块中.
  • 与任何shell脚本一样,php文件必须由apache用户执行,并且没有^ M的
  • RewriteMap语句不能放在.htaccess中,但是使用map的其他语句可以.

Ign*_*ams 5

RewriteCond %{HTTP_COOKIE} !mysessioncookie=([^;]+)
RewriteRule .+\.(jpg|css|js) forbidden.html [R=403]
Run Code Online (Sandbox Code Playgroud)

  • 那么这不是很容易被规避吗?OP 希望根据其数据库中的正确会话来验证 cookie。 (2认同)