需要帮助在suPHP中实现PHP会话

时间:2012-03-03 00:33:06

标签: php html apache suphp

我在here之前问了这个问题,但是用户CheekySoft指出我“在询问如何实施我的建议的解决方案”,而我应该“陈述我的问题”并提出解决方案的想法“。所以这里。

在linux服务器上,我有像这样设置的文件

/home
├──  user1
│   ├── [-rwx------]  index.html
│   └── [-rwx------]  index.php
└──  user2
    ├── [-rwx------]  index.html
    └── [-rwx------]  index.php

如果我在

设置了Apache虚拟主机
<Directory /home/user1>`
<Directory /home/user2>

然后[任意]用户可以转到www.example.com/user1/index.htmlwww.example.com/user2/index.html。但是,这些文件的权限为0700,因此,它们无法通过Web访问。因此我正在使用suPHP。

为了论证,我们可以说index.php只有以下内容

的index.php:

<?php
echo file_get_contents('index.html');
exit();
?> 

现在,设置suPHP后,user1可以转到www.example.com/user1/index.php查看index.html。同样,user2可以转到www.example.com/user2/index.php查看index.html。但是,user1可以同时转到www.example.com/user2/index.php查看user2的index.html页面,反之亦然#2。

解决这个问题的自然方法是PHP sessions。对页面的所有请求都被重定向到主页面(即www.facebook.com),用户将根据数据库进行验证,然后重定向到正确的页面(参见下图)。

User Interaction diagram

用户将转到某个页面(即www.example.com/page1.html),然后会有第1页硬编码的一部分,以确保存在有效会话。如果存在,则加载页面。如果它不存在,则会将用户重定向到index.html。登录并建立有效会话后,会将其重定向回原始页面。我们可以修改index.php来执行此操作:

indexValidate.php:

<?php
//this is purely pseudo code, I can't guarantee it will work
session_start();
require_once 'Session_Validator.php';
$sv = new Session_Validator();
$sv->validate($un, $pwd);

echo file_get_contents('index.html');
exit();
?>

但是,在我的设计中,这些页面(page1.htmlpage2.html ...)位于用户自己的目录(index.htmlindex.php)中,因此,服务器不能要求他们有这个硬编码部分检查有效部分。用户可以简单地编辑文件以删除此部分。当然这对用户来说是愚蠢的,但我不希望用户必须修改他们的每一个文件,以便在顶部有一个会话检查部分。我希望这是无缝的。

一些注意事项:

  1. 我可以使用Apache将所有请求重定向到单个validateUser.php脚本,然后验证用户是否有效,调用所请求的原始脚本。但是,这有副作用,suPHP现在已经切换到用户,很可能是var-www
  2. 我不想使用Apache web login authentication
  3. 任何人都可以为我的问题提供解决方案吗?

1 个答案:

答案 0 :(得分:1)

如何为所有用户创建apache重写规则,并为所有PHP个页面创建一个HTML包装器

RewriteRule可能类似于:

RewriteCond %{REQUEST_URI} !^/auth
RewriteRule ^(.*) /auth/wrapper.php?uri=$1

wrapper.php

  1. 检查用户是否经过验证。如果没有,请重定向到/auth/validate.php?redirect=<where-I-came-from>
  2. 如果已经过验证,请加载uri=<...>

    中提到的文件

    echo file_get_contents('<...>');

  3. 编辑: 您可以创建指向wrapper.php的符号链接,然后在符号链接上设置对用户的权限。你可以在auth文件夹中执行此操作:

    ln -s wrapper.php username1.php
    chown -h username1:username1 username1.php
    

    然后你会得到一个像这样的文件夹:

    -r--r--r--. 1 var-www   var-www   15 march   3 12:45 wrapper.php
    lrwxrwxrwx. 1 username1 username1 17 march   3 12:47 username1.php -> wrapper.php
    lrwxrwxrwx. 1 username2 username2 17 march   3 12:52 username2.php -> wrapper.php
    lrwxrwxrwx. 1 username3 username3 17 march   3 12:52 username3.php -> wrapper.php
    

    请注意:用户必须能够阅读auth目录 为了使其更安全,您可以将wrapper.php放在一个单独的目录中。