【问题标题】:Need help implementing PHP sessions in suPHP需要帮助在 suPHP 中实现 PHP 会话
【发布时间】:2012-03-03 00:33:05
【问题描述】:

我在 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>

然后 [any] 用户可以转到 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。同样,用户 2 可以前往www.example.com/user2/index.php 查看index.html。但是,user1也可以www.example.com/user2/index.php查看user2的index.html页面,反之亦然。

处理这个问题的自然方法是通过PHP sessions。对页面的所有请求都被重定向到主页(即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 login authentication

谁能为我的问题提供解决方案?

【问题讨论】:

标签: php html apache suphp


【解决方案1】:

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

RewriteRule 可能类似于:

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

wrapper.php:

  1. 检查用户是否经过验证。如果没有,请重定向到/auth/validate.php?redirect=&lt;where-I-came-from&gt;
  2. 如果验证通过,加载uri=&lt;...&gt;中提到的文件

    echo file_get_contents('&lt;...&gt;');

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

【讨论】:

  • 我以前试过。问题是谁拥有wrapper.php?如果所有者是 apache,则 wrapper.php 以用户 apache 的身份运行(我认为是 www-data),我认为当该脚本尝试访问时,例如,/home/user1/index.php,该文件具有权限 0700 和不同的所有者,所以它不能执行它(不能读取 /home/user1/index.html 出于同样的原因)。
  • 现在我可以为每个用户创建一个由用户拥有的包装类,因此当用户调用时,suPHP 会运行该用户的脚本 as。但是,我如何限制用户修改该文件(毕竟它非常敏感)?我可以以某种方式将所有这些“用户”文件放在用户无法访问但 Apache 可以访问的单独目录中吗?你可能正在做某事。文件是否可以由父目录所有者以外的用户拥有(不包括粘性目录)?
  • 但是 suPHP 会使用符号链接的所有者还是实际文件?我使用了类似的东西:/etc/validator (var-www 0700)/etc/validator/user1 (var-www 0700)/etc/validator/user1/validate.php (user1 0700)。这样文件属于user1,但是因为user1没有validator/user/的访问权限,所以他们不能编辑文件=)
  • 当然,您的解决方案还有一个额外的好处,即文件只有一个副本。
  • 我很确定您的解决方案行不通。我收到以下错误“符号链接 /auth/username1.php 的 UID 或 GID 与其目标不匹配”
猜你喜欢
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多