2012-03-03 187 views
0
执行PHP会议

我问这个问题here之前,但用户CheekySoft指出,我在“问如何实现我提出的解决方案”里,而不是我只是应“说明我的问题,并要求解决思路” 。所以在这里。需要帮助suPHP

在Linux服务器我已经建立了像这样

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

的文件如果我在

<Directory /home/user1>` 
<Directory /home/user2> 

设置Apache虚拟主机那么[任何]用户可以去www.example.com/user1/index.htmlwww.example.com/user2/index.html 。但是,这些文件的权限是0700,因此,它们无法通过网络访问。正因为如此,我使用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。但是,用户1可以也可以转到www.example.com/user2/index.php查看用户2的index.html页面,反之亦然user2。

处理这个问题的自然方法是通过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

任何人都可以提供一个解决我的问题?

+0

我相当有信心我的问题没有解决方案http://stackoverflow.com/a/9561335/654789 – puk 2012-03-06 04:39:42

回答

1

如何为所有用户创建一个apache重写规则,为所有

HTML页面创建一个单一 PHP包装

的重写规则可能是这样的:

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,然后设置权限用户的符号链接。你可以在身份验证文件夹中做到这一点:

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放在一个单独的目录中。

+0

我曾尝试过。问题是谁拥有'wrapper.php'?如果所有者是apache,那么运行'wrapper.php'作为用户apache(我认为它是'www-data'),*我认为*当该脚本尝试访问时,例如'/ home/user1/index。该文件具有权限'0700'和不同的所有者,所以它不能执行它(由于相同的原因,不能读取'/ home/user1/index.html')。 – puk 2012-03-03 02:05:47

+0

现在我可以为用户拥有的每个用户创建一个包装类,所以当用户调用时,suPHP以**该用户的身份运行脚本**。但是,那么如何限制用户修改该文件(毕竟它非常敏感)呢?我可以以某种方式将所有这些'用户'文件放在一个单独的目录中,用户无法访问,但Apache可以吗?你可能会找到一些东西。文件是否可以由父目录所有者以外的用户拥有(不包括粘性目录)? – puk 2012-03-03 02:11:48

+0

但是suPHP会使用符号链接的所有者还是实际的文件?我使用类似于:'/ etc/validator(var-www 0700)','/ etc/validator/user1(var-www 0700)'和'/etc/validator/user1/validate.php(user1 0700)' 。通过这种方式,文件属于user1,但由于user1无法访问'validator /'或'user /',那么他们无法编辑该文件=) – puk 2012-03-04 11:20:24