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

使用PHP限制登录用户对内容的访问,php,mysql,apache,authentication,session,Php,Mysql,Apache,Authentication,Session,我有一个LAMP设置,我只想能够保护网页上的内容(图像、css、视频等),这样只有登录的用户才能访问它 我意识到我可以用.htaccess轻松做到这一点。但是,我不想使用认证弹出窗口,我希望能够使用会话,也能够注销 我正在使用php进行mysql身份验证和创建会话。这很有效。但是图像、css、javascript等仍然可以访问 如何仅在存在有效的php会话时才允许访问内容 我遇到过使用mod_rewrite将文件转发到php文件(如auth.php?file=…)并在那里执行会话检查的情况。对于

我有一个LAMP设置,我只想能够保护网页上的内容(图像、css、视频等),这样只有登录的用户才能访问它

我意识到我可以用.htaccess轻松做到这一点。但是,我不想使用认证弹出窗口,我希望能够使用会话,也能够注销

我正在使用php进行mysql身份验证和创建会话。这很有效。但是图像、css、javascript等仍然可以访问

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

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

是否有类似apache的mod_session_cookie的mod,可以检查会话数据库中是否存在具有会话密钥的cookie,以及是否设置了目录的Allow from all

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

编辑:

以下是我的问题解决方案:

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

RewriteLock/var/www/lib/rewrite.lock
#...
重新启动发动机
RewriteMap sessionValid prg:/var/www/lib/allow.php
重新启动发动机
重写cond%{HTTP_COOKIE}!客户端cookie=([^;]+)
重写规则。*-[L,R=403]
RewriteCond%{HTTP_COOKIE}客户端COOKIE=([^;]+)
RewriteCond${sessionValid:%1}!有效的
重写规则。*-[L,R=403]
以及脚本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);
?>
#/usr/bin/php5

使用某种形式的控制器来服务图像,而不是直接链接到资源


例如,链接到“images/bob.jpg”实际上不会指向资源,而是指向一个脚本,该脚本检查登录,如果成功,则发送带有正确数据的图像/jpeg头。

我实际上不使用Apache;我使用lighttpd,它包括一个插件,您可以使用该插件根据URI中是否传递了正确的哈希来限制对文件夹的访问。基本上,您的应用程序逻辑和Web服务器共享一个秘密salt,然后使用该salt生成当前时间的哈希,该哈希也随哈希一起传递。如果时间在过去5分钟内,则授予访问权限。如果不是,或者哈希无效,那么它就不是。我在谷歌上搜索,看看目前是否有类似的Apache插件

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

编辑:似乎对Apache做了同样的事情。

他在回答中提到了这一技巧;他问是否有一种替代方案不需要为每一条内容都运行脚本。请原谅我没有使用Apache fu——这不仅仅是检查cookie的存在吗?那么这不是很容易绕过吗?OP希望根据其数据库中的正确会话验证cookie。@Brock:这需要一个脚本,作为重定向映射或重定向目标。这可能会实现。正如Brock所提到的,如何根据数据库中的会话密钥进行验证?或者我会被迫创建和检查会话文件,比如使用RewriteMap?验证会话cookie值需要脚本。不幸的是,这似乎需要更改URL,这对我来说不是一个选项。
RewriteCond %{HTTP_COOKIE} !mysessioncookie=([^;]+)
RewriteRule .+\.(jpg|css|js) forbidden.html [R=403]