Ограничить доступ к контенту для зарегистрированных пользователей с PHP - PullRequest
6 голосов
/ 12 февраля 2010

У меня есть настройка LAMP, и я просто хочу иметь возможность защищать контент на веб-странице (изображения, CSS, видео и т. Д.), Чтобы к нему могли обращаться только зарегистрированные пользователи.

Я понимаю, что могу легко сделать это с помощью .htaccess. Однако я не хочу использовать всплывающее окно аутентификации, и я хочу иметь возможность использовать сеансы и выходить из системы.

Я использую php для аутентификации с помощью mysql и создания сессий. Это прекрасно работает. Но изображения, CSS, Javascript и т. Д. Все еще доступны.

Как мне разрешить доступ к контенту, только если существует действительный php-сеанс?

Я сталкивался с использованием mod_rewrite для пересылки файлов в php-файл (например, auth.php? File = ...) и выполнения там проверки сеанса. Это кажется неэффективным для проверки сеанса для каждого отдельного изображения на странице, которая уже была проверена. Это похоже на взлом, и я продолжаю думать, что есть более чистый способ сделать это.

Существует ли мод для apache, такой как mod_session_cookie, который мог бы проверять, существует ли в моей базе данных сеанс cookie с сеансовым ключом и, если да, устанавливает Allow from all для каталога?

В качестве альтернативы, возможно ли использовать mod_auth_mysql, но также можно использовать сеансы и вход в систему, используя форму php, а не всплывающее окно аутентификации?

EDIT:

Вот мое решение проблемы:

В моем конфигурационном файле apache (не .htaccess) я добавил:

RewriteLock /var/www/lib/rewrite.lock

<VirtualHost>
    #...
    RewriteEngine on
    RewriteMap sessionValid prg:/var/www/lib/allow.php

    <Directory /var/www/client/*>
            RewriteEngine on

            RewriteCond %{HTTP_COOKIE} !client-cookie=([^;]+)
            RewriteRule .* - [L,R=403]

            RewriteCond %{HTTP_COOKIE} client-cookie=([^;]+)
            RewriteCond ${sessionValid:%1} !valid
            RewriteRule .* - [L,R=403]
    </Directory>
</VirtualHost>

И скрипт allow.php:

#!/usr/bin/php5
<?php
set_time_limit(0);

echo ""; 
$stdin = fopen("php://stdin","r");
$db = mysql_connect(...);  
mysql_select_db(..., $db);
$querypre = "SELECT ID FROM Sessions WHERE ID='";

while (1) {
  $line = trim(fgets($stdin));

  $query = $querypre.mysql_real_escape_string($line)."'";
  $result = mysql_query($query);

  if (mysql_num_rows($result) > 0)
    echo("valid\n");
  else
    echo("0\n");
}

mysql_close($db);
?>

Это работает как шарм. Используя это и session_set_save_handler Я смог использовать сеансы php, поддерживаемые mysql, для защиты как страниц php, так и всего содержимого внутри. Я надеюсь, что кто-то найдет это полезным.

Некоторые предостережения:

  • Оператор RewriteMap должен быть определен внутри блока виртуального хоста, если вы собираетесь использовать его внутри этого виртуального хоста. Размещение его вне блока не будет работать.
  • Вы должны включить RewriteEngine перед определением RewriteMap, иначе он будет проигнорирован.
  • RewriteLock не может быть в блоке виртуального хоста.
  • Как и в любом сценарии оболочки, файл php должен быть исполняемым пользователем apache и не должен содержать ^ M's
  • Операторы RewriteMap нельзя поместить в .htaccess, но другие операторы, использующие карту, могут.

Ответы [ 3 ]

6 голосов
/ 12 февраля 2010
RewriteCond %{HTTP_COOKIE} !mysessioncookie=([^;]+)
RewriteRule .+\.(jpg|css|js) forbidden.html [R=403]
0 голосов
/ 12 февраля 2010

Я на самом деле не использую Apache; Я использую lighttpd, который включает в себя плагин, который можно использовать для ограничения доступа к папке на основании того, что в URI передан правильный хеш. По сути, логика вашего приложения и веб-сервер совместно используют секретную соль, которая затем используется для создания хэша с текущим временем, которое также передается с хешем. Если время в течение последних 5 минут, то оно предоставляет доступ. Если нет, или если хеш является недействительным, то это не так. Я гуглю вокруг, чтобы посмотреть, есть ли подобный плагин для Apache на данный момент.

Редактировать: mod_auth_token , кажется, делает то же самое для Apache.

0 голосов
/ 12 февраля 2010

Вместо прямой ссылки на ресурсы, используйте некоторую форму контроллера для обслуживания изображений.

Например, ссылка на 'images / bob.jpg' на самом деле не будет указывать на ресурс, но скрипт, который проверяет вход в систему и в случае успеха отправляет заголовки image / jpeg с правильными данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...