Контрольный вопрос

В моем CMS у меня есть index.php, где клиент должен ввести имя пользователя и пароль. если они верны, он переместится в admin.php, где находится cms.

но теперь хакер может войти в cms/admin.php, поэтому моя безопасность сейчас ужасна.


я знаю, что я могу использовать $_SESSION переменная.

index.php - я могу дать некоторое значение $_SESSION['success']:

$_SESSION['success'] = TRUEи в admin.php просто проверьте это

admin.php

if($_SESSION['success'] == TRUE)
{
     my script here...
}
else header("Location: index.php");

но я хочу обогатить этот эффект без СЕССИИ. не могли бы вы дать мне идею, как я могу это сделать?

Спасибо

5 ответов

Решение

Безопасность веб-приложений действительно очень глубока. Во-первых, вам нужно использовать сеансы или эквивалентную реализацию сеансов.

Пользователь входит в систему, и вам нужно, чтобы идентификатор сеанса и его имя пользователя были сохранены в файле cookie и в базе данных. В базе данных вам также необходимо хранить некоторую информацию о них, например, об их пользовательском агенте, чтобы вы могли определить, был ли их сеанс перехвачен. Некоторые люди хранят IP-адрес. Это не будет работать, если пользователь использует ваше приложение с мобильного устройства, поскольку его IP-адрес может часто обновляться.

Каждый раз, когда пользователь загружает административную страницу, убедитесь, что у него есть сеанс и пользовательский файл cookie, которые являются действительными и имеют разрешение на использование этой страницы. Затем убедитесь, что запрос пришел с того же компьютера, на котором он был запущен, используя информацию, которую вы сохранили об этом пользователе.

Для каждой формы или ссылки, размещенной на странице администрирования, которая может привести к административным действиям, добавьте скрытое поле или значение с уникальным идентификатором. Один идентификатор на элемент на странице, который может привести к административным действиям. Когда вы генерируете эти идентификаторы, сохраняйте их в базе данных вместе с тем, какое действие они идентифицируют. Это называется nonce, оно будет отправлено с каждым запросом администратора (например, обновление записей или удаление пользователей или перевод средств с вашего банковского счета). Когда запрос обслуживается, сервер должен проверить, соответствует ли одноразовый номер тому, что было сохранено в базе данных, и затем избавиться от него. Если он не совпадает, скорее всего, запрос был сделан с помощью атаки подделки межсайтовых запросов.

Это всего лишь некоторые вещи, которые следует иметь в виду при взаимодействии с аутентифицированными пользователями, и, конечно, есть множество других вещей, на которые стоит обратить внимание, таких как XSS.

Безопасность очень сложна, и, хотя ваше веб-приложение может не обеспечивать пуленепробиваемые стратегии безопасности, вы обязаны предоставить своим пользователям защиту их паролей и личной информации. Смотрите OWASP для (намного) большей информации.

Нет, вы не хотите делать это без сессий. Другие способы сделать это, куки и реферер, так же безопасны, как и блокировка экрана.

Код, который вы разместили, неверен и не имеет смысла. (должно быть == trueи почему вы позволяете ему просматривать ваш сценарий по ошибке, а не по успеху?)

Более того, почему вы не хотите использовать сессии? Вам необходимо как-то аутентифицировать пользователя, а для этого нужно сохранить какое-то состояние, чтобы вам не приходилось заставлять пользователя входить в систему каждый раз, когда он меняет страницы.

Чтобы иметь возможность внедрить свою собственную систему безопасности, вы должны иметь возможность отслеживать пользователя по запросам, другими словами, иметь возможность иметь состояние пользователя. Сессии - это способ сделать это в PHP. Вы можете либо использовать встроенный сеанс, либо самостоятельно реализовать собственный. Последний из этих двух вариантов сложнее необходимого и, скорее всего, не выгоден в вашей ситуации.

Главное, что нужно помнить о сессиях в PHP, это то, что вы всегда должны запускать их для каждого запроса. У вас должен быть где-нибудь глобальный включаемый файл, возможно, какой-то файл конфигурации. Я предлагаю вам разместить свой session_start(); в верхней части этого файла, чтобы убедиться, что он выполняется правильно для каждого запроса. Помните, что сессия должна быть запущена перед отправкой любых заголовков, другими словами, перед отправкой любого вывода.

Одним из недостатков использования PHP для обеспечения доступа к части вашего сайта является то, что он работает, только если запрос к файлу PHP. Например, если у вас есть изображения, документы или другие носители, которые вы хотите защитить, если вы не используете их через какой-либо PHP-шлюз / фильтр, эти файлы, вероятно, будут доступны без аутентификации.

В связи с этим я предлагаю вам изучить базовую или дайджест-аутентификацию, предоставляемую Apache. Для ваших нужд он, скорее всего, обеспечит более чем адекватную безопасность и невероятно прост в реализации - не требует кодирования. Более того, большинство веб-хостов имеют инструмент администратора для управления этим типом аутентификации, который обычно называется чем-то вроде "защищенной паролем папки", "заблокированной папки" и т. Д. Все, что вам нужно сделать, - это выбрать папку, задать имя пользователя, пароль и все готово

У вас есть два варианта:

  1. аутентифицироваться при каждом запросе (использовать HTTP-аутентификацию, которую браузер делает невидимым в фоновом режиме)
  2. аутентифицироваться один раз, затем сохранить какой-то ключ на компьютере пользователя и сохранить ссылку на него на сервере

Первый работает, но он менее безопасен и менее удобен для пользователя. Второе, что делает сессия; если вы попытаетесь переопределить его самостоятельно, скорее всего, у вас будет несколько дыр в безопасности. Есть ли какие-то реальные причины, по которым вы не хотите использовать сеансы?

Другие вопросы по тегам