【发布时间】: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.html 或 www.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.html,page2.html...)位于用户自己的目录中(index.html,index.php),因此,服务器不能要求它们具有此硬编码部分检查有效部分。用户可以简单地编辑文件以删除此部分。当然,这对用户来说是愚蠢的,但我不希望用户必须修改他们的每一个文件才能在顶部有一个会话检查部分。我希望这是无缝的。
几点说明:
- 我可以使用 Apache 将 所有 请求重定向到单个
validateUser.php脚本,该脚本验证用户,然后如果有效,则调用请求的原始脚本。但是,这有一个副作用,即 suPHP 现在已经切换到用户,很可能是var-www - 我不想使用Apache web login authentication
谁能为我的问题提供解决方案?
【问题讨论】:
-
我相当有信心我的问题没有解决方案stackoverflow.com/a/9561335/654789