0

我之前在这里问过这个问题,但用户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只有以下内容

索引.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.html, page2.html...) 位于用户自己的目录 ( index.html, index.php) 中,因此,服务器不能要求他们有这个硬编码的部分来检查有效部分。用户可以简单地编辑文件以删除此部分。当然,这对用户来说是愚蠢的,但我不希望用户必须修改他们的每一个文件才能在顶部有一个会话检查部分。我希望这是无缝的。

几点注意事项:

  1. 我可以使用 Apache 将所有请求重定向到单个validateUser.php脚本,然后验证用户,如果有效,则调用请求的原始脚本。但是,这有一个副作用,即 suPHP 现在已经切换到用户,很可能var-www
  2. 我不想使用Apache Web 登录身份验证

任何人都可以为我的问题提供解决方案吗?

4

1 回答 1

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

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

于 2012-03-03T01:10:30.073 回答