У меня есть настройка LAMP, и я просто хочу иметь возможность защищать контент на веб-странице (изображения, css, видео и т. Д.), Чтобы только зарегистрированные пользователи могли получить к нему доступ.
Я понимаю, что могу сделать это легко с .htaccess. Однако я не хочу использовать всплывающее окно аутентификации, и я хочу иметь возможность использовать сеансы и также иметь возможность выхода из системы.
Я использую php для выполнения задания аутентификации с помощью mysql и создания сеансов. Это отлично работает. Но изображения, css, javascript и т. Д. Все еще доступны.
Как разрешить доступ к контенту только в том случае, если существует действительный сеанс php?
Я столкнулся с использованием mod_rewrite для пересылки файлов в php-файл (например, auth.php? File = …) и проведет там проверку сеанса. Это кажется неэффективным для проверки сеанса для каждого отдельного изображения на странице, которая уже была проверена. Это похоже на взлом, и я продолжаю думать, что есть более чистый способ сделать это.
Есть ли мода для apache, например mod_session_cookie, которая может проверить, существует ли файл cookie с ключом сеанса в моей базе данных сеансов, и если это так, установите Allow from all for the directory?
В качестве альтернативы можно ли использовать mod_auth_mysql, но также иметь возможность использовать сеансы и логин с использованием php-формы, а не всплывающего окна аутентификации?
РЕДАКТИРОВАТЬ:
Вот мое решение проблемы:
В моем файле конфигурации 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, так и всего содержимого внутри. Надеюсь, кто-то найдет это полезным.
Некоторые оговорки:
RewriteCond %{HTTP_COOKIE} !mysessioncookie=([^;]+) RewriteRule .+\.(jpg|css|js) forbidden.html [R=403]
Вместо того, чтобы напрямую связываться с ресурсами, используйте какой-либо контроллер, чтобы обслуживать изображения.
Например, ссылка на «images / bob.jpg» на самом деле не указывает на ресурс, но скрипт, который проверяет логин и в случае успеха отправляет заголовки изображений / jpeg с правильными данными.
Я фактически не использую Apache; Я использую lighttpd, который включает в себя плагин, который вы можете использовать для ограничения доступа к папке на основе того, если в URI передан правильный хеш. В принципе, ваша прикладная логика и веб-сервер разделяют секретную соль, которая затем используется для генерации хэша с текущим временем, которое также передается с хешем. Если время находится за последние 5 минут, оно предоставляет доступ. Если нет, или если хэш недействителен, значит, нет. Я googling вокруг, чтобы увидеть, есть ли аналогичный плагин для Apache в данный момент.
Edit: mod_auth_token, похоже, делает то же самое для Apache.