лучшая практика аутентификации на php …?

#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 )