2012-03-03 3 views
0

Я задал этот вопрос перед here но пользователем CheekySoft указал, что я «с вопросом, как реализовать мое предложенного решения», где вместо этого я должен просто «изложить свою проблему и попросить идеи решения» , Так вот.Нужна помощью реализации PHP сессий в suPHP

На сервере 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. Аналогично, пользователь2 может перейти на www.example.com/user2/index.php для просмотра index.html. Тем не менее, пользователь1 может также перейдите на страницу www.example.com/user2/index.php, чтобы просмотреть страницу пользователя user2's index.html и наоборот для пользователя2.

Естественный способ справиться с этим через PHP sessions. Все запросы на страницу перенаправляются на главную страницу (то есть 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 web login authentication

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

+0

Я довольно уверен, что мой вопрос не имеет решения http://stackoverflow.com/a/9561335/654789 – puk

ответ

1

Как насчет создания правила перезаписи апачской для всех пользователей и создать одну единственную 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, а затем установить разрешения на символическая ссылка на пользователя. вы могли бы сделать это в папке Идента:

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 в отдельный каталог.

+0

Я пробовал это раньше. Проблема в том, кто владеет 'wrapper.php'? Если владелец - apache, тогда 'wrapper.php' запускается как пользователь apache (я думаю, что это' www-data') и * я думаю *, когда этот скрипт пытается получить доступ, например, '/ home/user1/index. php', этот файл имеет разрешения '0700' и ​​другого владельца, поэтому он не может его выполнить (не может читать'/home/user1/index.html' по той же причине). – puk

+0

Теперь я могу создать класс-оболочку для каждого пользователя, принадлежащего пользователю, поэтому при вызове пользователя suPHP запускает скрипт ** как ** этого пользователя. Но как я могу ограничить пользователя от изменения этого файла (в конце концов, он чрезвычайно чувствителен)? Могу ли я как-то поместить все эти «пользовательские» файлы в отдельный каталог, где пользователь не может получить доступ, но Apache может? Наверное, вы можете что-то сказать. Может ли файл принадлежать пользователю, отличному от владельца родительского каталога (исключены липкие каталоги)? – puk

+0

Но будет ли suPHP использовать владельца символической ссылки или фактического файла? Я использовал что-то вроде: '/ etc/validator (var-www 0700)', '/ etc/validator/user1 (var-www 0700)' и '/etc/validator/user1/validate.php (user1 0700)' , Таким образом, файл принадлежит user1, но поскольку user1 не имеет доступа к 'validator /' или 'user /', то они не могут редактировать файл =) – puk

 Смежные вопросы

  • Нет связанных вопросов^_^