Я задал этот вопрос до этого, но пользователь 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.html
или www.example.com/user2/index.html
. Тем не менее, разрешения для этих файлов – 0700
, поэтому они недоступны через Интернет. Именно по этой причине я использую suPHP.
Для аргумента, скажем, index.php
имеет в нем только следующее:
index.php:
<?php echo file_get_contents('index.html'); exit(); ?>
Теперь, с настройкой suPHP, пользователь1 может перейти на www.example.com/user1/index.php
чтобы просмотреть index.html
. Аналогично, user2 может перейти на www.example.com/user2/index.php
чтобы просмотреть index.html
. Тем не менее, пользователь1 также может перейти на www.example.com/user2/index.php
для просмотра страницы index.html
user2 и наоборот для пользователя2.
Естественный способ справиться с этим – через сеансы 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
, page1.html
…) находятся в собственном каталоге пользователей ( index.html
, index.php
), поэтому сервер не может требовать, чтобы у них был этот жесткий код проверьте правильность раздела. Пользователь может просто отредактировать файл, чтобы удалить этот раздел. Конечно, это было бы глупо с точки зрения пользователя, но я не хочу, чтобы пользователь должен был модифицировать каждый из своих файлов, чтобы иметь секцию проверки сессии вверху. Я хочу, чтобы это было без проблем.
Несколько примечаний:
validateUser.php
который затем проверяет пользователя, если он действителен, вызывает исходный скрипт. Однако это имеет побочный эффект, который suPHP теперь уже переключил на пользователя, скорее всего, var-www
Может ли кто-нибудь решить проблему?
Как создать правило перезаписи apache для всех пользователей и создать одну оболочку PHP
для всех HTML
страниц
RewriteRule может быть чем-то вроде:
RewriteCond %{REQUEST_URI} !^/auth RewriteRule ^(.*) /auth/wrapper.php?uri=$1
И в wrapper.php
:
/auth/validate.php?redirect=<where-I-came-from>
Если это подтверждено, загрузите файл, указанный в uri=<...>
echo file_get_contents('<...>');
EDIT: вы можете создавать символические ссылки на файл 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 в отдельный каталог.