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

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

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

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

    Как создать правило перезаписи 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 

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