繁体   English   中英

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

[英]Need help implementing PHP sessions in suPHP

我在这里之前曾问过这个问题,但用户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页面,反之亦然。

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

用户互动图

用户将转到页面(即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登录身份验证

谁能解决我的问题?

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

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('<...>');

编辑:您可以创建指向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放在单独的目录中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM