小编Luk*_*uke的帖子

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

我有一个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 …
Run Code Online (Sandbox Code Playgroud)

php mysql apache authentication session

6
推荐指数
1
解决办法
4208
查看次数

标签 统计

apache ×1

authentication ×1

mysql ×1

php ×1

session ×1