Самое важное, что нужно запомнить:
Не верьте НИЧЕМ, что приходит от клиента
Никогда не предполагайте, что информация, которую вы получаете (в поле формы (даже скрытые), переменные сеанса и т. Д.), Является действительной - используйте серверную логику для выполнения этих проверок.
1.) Убедитесь, что ваша сессия зашифрована. Если вы используете встроенные сессии PHP, связанная с этим энтропия (случайность) относительно высока, поэтому с вами все будет в порядке.
2.) ТОЛЬКО сохраняйте идентификатор сессии в файле cookie. Любая другая информация должна быть просто связана на сервере с использованием этого идентификатора. Я видел много случаев, когда системный инженер определяет, является ли кто-то администратором, если в сеансе токен is_admin = true. Очевидно, вы можете увидеть проблему с этим.
Некоторые будут жаловаться, что это дорогостоящая операция, но я рекомендую создать (мою) таблицу SQL для активных сеансов. Затем, когда страница загружена, извлеките связанные данные из таблицы и обработайте их так же, как и любые другие данные. Некоторые платформы (например, CodeIgnitor) делают это для вас, изменяя один элемент конфигурации.
3.) Проверить по IP - добавьте в свою таблицу текущий IP-адрес. Если текущий IP-адрес не совпадает с IP-адресом в сеансе, возможно, кто-то пытается взломать его. Принудительно выйти и прекратить.
4.) Установите ограничения на попытки входа в систему. Добавление 1 секунды сна (); серверная сторона при каждом входе в систему практически незаметна для пользователя, но для автоматизированной системы практически невозможно сделать грубый принудительный вход в систему.
5.) Смотри, чтобы быть «слишком болтливым». При входе в систему вы можете подумать, что полезно дать описательные ошибки типа «имя пользователя не существует» или «неверный пароль». Подобная информация говорит хакеру, что он получил действительное имя пользователя - это делает взлом намного быстрее.
6.) Меньше заботьтесь о безопасности PHP и SSL и больше вашей собственной логики. Тот факт, что веб-сайт использует SSL, не делает его безопасным. SSL в сочетании с правильной логикой обеспечивает безопасность.
7.) Если вы заинтересованы в СУПЕР, вам нужно перейти на выделенный сервер. Возможно, что другие веб-сайты, размещенные на вашем сервере, могут иметь доступ к вашей информации о коде / базе данных. Возможно, они не предпринимают необходимых шагов, чтобы быть в безопасности, как вы.
8.) Не разрешать одновременные сеансы. Это предотвращает атаку MITM (человек посередине). Еще одним преимуществом подхода к сеансу БД является то, что вы можете принудительно выйти из системы, если два клиента пытаются одновременно войти в систему с разных IP-адресов. Еще одно преимущество подхода БД заключается в том, что он делает вашу систему масштабируемой (поскольку хранилище сеансов зависит от файловой системы).
9.) Используйте mysql_real_escape_string вместо add_slashes
Если вам нужна дополнительная информация о безопасности с помощью PHP, это моя специальность. Не стесняйтесь связаться со мной.