Intereting Posts
Regex – удалить теги 'a', где ссылка содержит определенные домены Рассмотрение проблем безопасности с помощью команды «exec» php Какова функция побитового оператора (Тильда) Использование php для вывода видео mp4 Как найти файл php.ini, используемый командной строкой? Как показать последние уведомления в jQuery / php / mySQL? отправлять данные на PHP из приложения iphone в объекте c Копирование PHP-кода из учебника дает уведомления на моем компьютере Специальное сообщение для проверки Laravel Validation Какая лучшая кодировка символов для японского языка для отображения DB, php и html? создание php 5.5 из источника в centos, отсутствует mod_php Предупреждение: mysql_result () : невозможно перейти к строке 0 по индексу результата MySQL 5 в файле profile.php в строке 11 Как скрыть сообщение об ошибке Php найти строку с регулярным выражением Получение только кусков загруженного файла в PHP?

Ограничить доступ к содержимому для входа в систему с помощью PHP

У меня есть настройка 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, так и всего содержимого внутри. Надеюсь, кто-то найдет это полезным.

Некоторые оговорки:

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

Solutions Collecting From Web of "Ограничить доступ к содержимому для входа в систему с помощью 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.