Нужна помощь в реализации PHP-сессий в suPHP
Я задавал этот вопрос ранее здесь, но пользователь 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, 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's index.html
страница, и наоборот для пользователя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
, page2.html
...) находятся в собственной директории пользователя (index.html
, index.php
), следовательно, сервер не может требовать, чтобы у них был этот жестко закодированный раздел, проверяющий правильность раздела. Пользователь может просто отредактировать файл, чтобы удалить этот раздел. Конечно, это было бы глупо со стороны пользователя, но я не хочу, чтобы пользователю приходилось изменять каждый отдельный файл, чтобы раздел проверки сеанса находился вверху. Я хочу, чтобы это было без проблем.
Несколько заметок:
- Я могу использовать Apache, чтобы перенаправить все запросы на один
validateUser.php
скрипт, который проверяет пользователя, затем, если он действителен, вызывает исходный запрошенный скрипт. Однако, это имеет побочный эффект, что suPHP уже переключился на пользователя, скорее всегоvar-www
- Я не хочу использовать аутентификацию веб-входа Apache
Кто-нибудь может предоставить решение моей проблемы?
1 ответ
Как насчет создания правила перезаписи 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('<...>');
РЕДАКТИРОВАТЬ: Вы можете создать символические ссылки на 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 в отдельный каталог.