Нужна помощь в реализации PHP-сессий в suPHP - PullRequest
0 голосов
/ 03 марта 2012

Я задавал этот вопрос раньше здесь , но пользователь 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 для просмотра страницы index.html пользователя user2 и наоборот для user2.

Естественным способом справиться с этим является сессия PHP.Все запросы к странице перенаправляются на главную страницу (т. Е. 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.html, page2.html ...) находятся в собственном каталоге пользователей (index.html, index.php), поэтому сервер не может требовать, чтобы у них была эта жестко закодированная секция, проверяющая правильность секции.Пользователь может просто отредактировать файл, чтобы удалить этот раздел.Конечно, это было бы глупо со стороны пользователя, но я не хочу, чтобы пользователю приходилось изменять каждый из своих файлов, чтобы раздел проверки сеанса находился вверху.Я хочу, чтобы это было без проблем.

Несколько замечаний:

  1. Я могу использовать Apache для перенаправления всех запросов на один validateUser.php скрипт, который затем проверяет пользователя, если он действителен,вызывает исходный запрошенный скриптТем не менее, это имеет побочный эффект, что suPHP уже переключился на пользователя, скорее всего var-www
  2. Я не хочу использовать Проверка подлинности через Apache

Может кто-нибудь предложить решение моей проблемы?

1 Ответ

1 голос
/ 03 марта 2012

Как насчет создания правила перезаписи 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('<...>');

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

Обратите внимание: пользователь должен иметь возможность читать каталог аутентификации. Чтобы сделать его еще более безопасным, вы можете поместить файл wrapper.php в отдельный каталог.

...