#php #security #authentication
#php #Безопасность #аутентификация
Вопрос:
У меня есть простая страница входа в систему, которая проверяет учетные данные по базе данных, а затем включает в себя каждую страницу auth.php
, которая проверяет $_SESSION['logged']
, установлена и срок действия сеанса не истек.
Проблема в том, что каждая страница также включает в себя другую страницу tab.php
(что-то вроде меню), к которой мне также нужно ограничить доступ, но включение auth.php
inside tab.php
приводит к тому, что включение происходит дважды. Однако, если я не включу auth.php
in tab.php
, любой может tab.php
получить прямой доступ в обход проверки подлинности и, возможно, получить личную информацию.
Есть ли какие-либо рекомендации по решению этой ситуации?
Редактировать:
И я забыл спросить, но какой путь вы используете, чтобы сделать его относительно корня сайта? Поскольку оба auth.php
и tab.php
находятся в папке, а тот index.php
, который включает tab.php
, находится в корне, функция включения выдает ошибку для index.php
or или tab.php
в соответствии с тем, какой путь я использую ( './includes/auth.php'
ИЛИ './auth.php'
) — если вы понимаете, что я имею в виду. Я пытался ‘/includes/auth.php «но это не работает.
Комментарии:
1. Что вы подразумеваете под «любой желающий может получить доступ tab.php «? Вы имеете в виду, что если они знают путь к файлу, они могут пойти посмотреть на него, введя его вручную?
2. Итак, вы хотите убедиться, что auth.php должен быть включен, но вы не хотите включать его дважды?
3. Разве вам просто не нужно:
include_once()
?4. У вас наверняка есть способ определить, действительно ли пользователь вошел в систему, не так ли? Почему бы не использовать это, чтобы узнать
tab.php
, авторизован ли пользователь для просмотра меню?5. Gazillion: Да (поскольку я не уверен, насколько сложно сканировать структуру сайта)
Ответ №1:
Используйте include_once
вместо include
в ваших файлах (или require_once
и require
). Это гарантирует, что ваш auth.php
файл будет включен только один раз за время существования скрипта.
Комментарии:
1. Да, вы правы. Я хотел убедиться, что то, что я на самом деле делаю, считается лучшей практикой или существуют другие способы ограничения доступа к файлам, включенным в другие файлы, если вы следите за мной.
2. Тем не менее, вы вызываете метод аутентификации дважды, что не требуется при записи в сеанс при успешной аутентификации. Достаточно проверить правильное значение сеанса в tab.php и нарисуйте ошибку, если она недоступна.
3. Да, я знаю. Но это сводит на нет весь смысл наличия этой проверки в отдельном файле. Например, если бы я хотел изменить ограничение по времени сеанса, мне пришлось бы изменить его,
auth.php
а также вtab.php
(и других файлах, которые включаются —auth.php
состоит из$_SESSION
проверки и$_SESSION
ограничения по времени
Ответ №2:
include_once
и require_once
, безусловно, гарантирует, что один и тот же файл не будет включен более одного раза (в то же время убедитесь, что вы прошли проверку подлинности).
Однако я бы добавил ваши включения в папку «включить» и запретил доступ — людям, которые будут вводить путь вручную — через файл htaccess. Таким образом, вы могли бы хранить свои включения в одном месте (независимо от того, как может выглядеть ваш заголовок includes) и сохранять включаемые файлы чистыми и по-прежнему недоступными. Если бы вы хотели это сделать, вам нужно было бы только сделать то, что Ян. упомянутый в ответе выше, и проверить, установлен ли ваш $_SESSION['logged']
(и любые другие проверки, которые вам нужны)
Комментарии:
1. Мне это кажется идеальной идеей (поскольку у меня уже есть включаемые файлы в отдельной папке), но концепция для меня новая. Вам все еще нужно включать
$_SESSION['logged']
проверку включенных файлов (tab.php
и других), когда вы вообще ограничиваете доступ к этой папке?2. Ну, я действительно не знаю, как работает ваш сайт. В этом случае, я полагаю, вам это действительно не понадобится, но у меня обычно разные меню в зависимости от типа пользователя (администратор, модератор, ванильный пользователь). Итак, в этом случае вместо проверки того, действительно ли они аутентифицированы, я бы проверил, какой пользователь и отобразил правильные вкладки.
3. Я хотел ограничить доступ к этому
tab.php
файлу, который сам по себе никогда не будет загружен только в браузере (он даже не содержит стилей, только текст) — на случай, если кто-то введет путь к файлу вручную. Кроме того, я только что понял, что, проверяя$_SESSION
, вам придется также инициализироватьsession_start();
внутриtab.php
, и если вы позже включите эту страницу внутрьindex.php
, вы получите двойную инициализацию сеанса, если я все правильно понял.4. Что ж, тогда файл .htaccess в вашей папке «includes» сделает это за вас 🙂
5. Работает как шарм. Спасибо -)
Ответ №3:
Просто проверьте tab.php если сеанс инициализирован и $_SESSION[‘logged’] имеет значение true. Это будет работать нормально, если auth.php загружается первым.
Комментарии:
1. И в противном случае вернет ошибку или предупреждение и заполнит ваши журналы ненужными сообщениями
2. Этого не будет. Просто код умный:
if (!isset($_SESSION['logged']) || !$_SESSION['logged']) { die('Access not granted'); }
3. В любом случае это шаткое решение, потому что ему придется добавлять этот код в любой файл, который он может использовать позже. Что, если он изменит пространство имен сеанса? Ему придется адаптировать это к каждому файлу, в котором он использует ваше решение. require_once, я думаю, лучше
4. Хорошо… То же самое относится к include_once или require_once — он должен быть во всех доступных файлах. Разница в том, что вам не нужно вставлять какие-либо дополнительные процедуры приложения и сценарии инициализации с моим подходом. 🙂
Ответ №4:
Как насчет использования require_once("auth.php");
? Это гарантирует, что auth.php включен (в противном случае приложение остановится), но включает файл только один раз, что, по-видимому, является вашей целью.
Ответ №5:
Попробуйте include_once() . См. ( http://php.net/manual/en/function.include-once.php )