Злоумышленники всегда готовы атаковать ваше веб-приложение, поэтому очень важно повысить безопасность вашего веб-приложения. К счастью, изОткрытый проект безопасности веб-приложенийРебята из (OWASP) составили исчерпывающий список известных проблем с безопасностью и способы защиты от них. Этот контрольный список обязателен к прочтению разработчиками, заботящимися о безопасности. Падраик БрэдиРуководство по выживанию: Безопасность PHPЭто также очень хороший материал для чтения по безопасности PHP.
хэш пароля
Все заканчивают тем, что добавляют модуль входа пользователя при создании приложения PHP. Учетная запись пользователя и пароль хранятся в базе данных и используются для аутентификации пользователя при входе в систему.
исправить перед сохранением пароляхэш-пароль очень важно. Хешированный пароль является односторонним и необратимым.Хеш-значение представляет собой строку фиксированной длины, и его нельзя обратить в обратном порядке для вычисления исходного пароля. Это означает, что вы можете хешировать другую строку паролей и сравнивать, являются ли они одним и тем же паролем, не зная исходного пароля. Если вы не хэшируете пароли, когда неавторизованная третья сторона попадет в вашу базу данных, информация об учетных записях всех пользователей не будет заблокирована. Некоторые пользователи могут (к сожалению) использовать тот же пароль на других сайтах. Поэтому мы должны обратить внимание на вопрос безопасности данных.
Пароли должны быть индивидуальнымилечение солью, соление означает добавление случайных подстрок перед хешированием. Это защищает от «взлома словаря» или «радужных коллизий» (база данных паролей, в которой хранятся универсальные хэши, которые можно использовать для обратного проектирования паролей).
Хеширование и соление очень важны, потому что во многих случаях пользователи будут использовать один и тот же пароль в разных службах, а безопасность паролей очень низкая.
К счастью, это легко сделать в PHP.
использовать password_hash
хешировать пароль
password_hash
Функция была представлена в PHP 5.5. Эта функция теперь использует BCrypt, самый надежный алгоритм шифрования, который в настоящее время поддерживается PHP. Конечно, в будущем эта функция будет поддерживать больше алгоритмов шифрования. password_compat
В библиотеке появилась поддержка версий PHP >= 5.3.7.
В следующем примере мы хэшируем строку и сравниваем ее с новым хеш-значением. Не удалось войти в систему, потому что две строки, которые мы использовали, были разными («секретный пароль» и «неверный пароль»).
password_hash()
С засолкой уже разобрались за вас. Добавленная случайная подстрока автоматически сохраняется алгоритмом шифрования и становится частью хэша.password_verify()
будет извлекать из него случайные подстроки, поэтому вам не нужно использовать другую базу данных для отслеживания этих случайных подстрок.
- К пониманию
password_hash()
- PHP >= 5.3.7 && password_compat
- Понимание хеширования в криптографии
- научиться добавлять соль
- PHP
password_hash()
RFC
Фильтрация данных
Никогда не доверяйте внешнему вводу. Пожалуйста, отфильтруйте и проверьте перед использованием внешнего ввода.filter_var()
и filter_input()
Функции могут фильтровать текст и проверять форматирование (например, адреса электронной почты).
Внешний ввод может быть любым:$_GET
и $_POST
Подождите, пока форма для ввода данных,$_SERVER
Некоторые значения в суперглобальных переменных, а также черезfopen('php://input', 'r')
Результирующее тело HTTP-запроса. Помните, что определение внешнего ввода не ограничивается данными, отправленными пользователем через форму. Загруженные и загруженные документы, значения сеанса, данные файлов cookie и данные сторонних веб-служб являются внешними входными данными.
Хотя внешний ввод можно сохранить, объединить и использовать позже, он все равно остается внешним вводом. Каждый раз, когда вы обрабатываете, экспортируете, связываете или включаете в код, напоминайте себе о том, что данные были безопасно отфильтрованы.
Данные могут использоваться для разных целейфильтр. Например, когда необработанный внешний ввод передается в вывод HTML-страницы, он может выполнять сценарии HTML и JavaScript на вашем сайте! Это атака с использованием межсайтовых сценариев (XSS), которая является очень опасным методом атаки. Один из способов избежать XSS-атак — очистить все пользовательские данные перед выводом на страницу, используяstrip_tags()
функция для удаления тегов HTML или использованияhtmlentities()
илиhtmlspecialchars()
для экранирования специальных символов для получения соответствующих объектов HTML.
Другой пример — передача параметров, которые можно выполнить в командной строке. Это очень опасно (и плохая практика), но вы можете использоватьescapeshellarg()
функция для фильтрации параметров выполняемой команды.
Последний пример — прием внешнего ввода для загрузки файлов из файловой системы. Это можно использовать, изменив имя файла на путь к файлу. вам нужно отфильтровать"/"
, "../"
, нулевой символили другие символы пути к файлу, чтобы гарантировать, что скрытые, личные или конфиденциальные файлы не будут загружены.
- Подробнее о фильтрации данных
- узнать больше
filter_var
- узнать больше
filter_input
- Узнайте больше о проблемах с нулевыми символами
очистка данных
Очистка данных относится к удалению (или экранированию) недопустимых и небезопасных символов из внешнего ввода.
Например, вам нужно отфильтровать внешний ввод, прежде чем включать его в HTML или вставлять в необработанный запрос SQL. когда вы используетеPDOПри использовании функции параметра limit в , она автоматически выполняет фильтрацию за вас.
Иногда может потребоваться разрешить ввод и включение некоторых безопасных HTML-тегов в выходную HTML-страницу, но сделать это непросто. Хотя есть некоторыеHTML PurifierПо этой причине библиотека классов занесена в белый список, на самом деле все больше людей избегают этой проблемы, используя другие более строгие ограничения форматирования, такие как использование Markdown или BBCode.
Десериализация
использовать unserialize()
Извлечение данных от пользователей или других ненадежных источников очень опасно. Это вызывает злонамеренное создание экземпляров объектов (содержащих определенные пользователем свойства),даже если объект не используется, который также запускает деструктор работающего объекта. Поэтому вам следует избегать десериализации данных из ненадежных каналов.
Если вам необходимо это сделать, используйте PHP 7allowed_classes
Варианты ограничения типа десериализации объекта.
Проверка действительности
Проверка заключается в том, чтобы убедиться, что внешний ввод является тем, что вам нужно. Например, вам может потребоваться проверить достоверность такой информации, как адрес электронной почты, номер мобильного телефона или возраст, при обработке заявки на регистрацию.
конфигурационный файл
Когда вы создаете файл конфигурации для своего приложения, лучше всего следовать следующим рекомендациям:
- Рекомендуется хранить информацию о конфигурации в месте, которое нельзя прочитать и загрузить напрямую.
- Если вы должны хранить файл конфигурации в корневом каталоге, используйте
.php
назвать расширение. Это гарантирует, что даже при прямом доступе к сценарию он не будет выводиться в виде открытого текста. - Информация в конфигурационном файле должна быть целенаправленно защищена путем ее шифрования или установки прав доступа.
- Не рекомендуется помещать конфиденциальную информацию, такую как пароли или токены API, в контроллер версий.
зарегистрировать глобальные переменные
Уведомление:Начиная с PHP 5.4.0,register_globals
опция удалена и больше не используется. Это напоминание о том, что вам нужно знать об этом, если вы обновляете старые приложения.
когда register_globals
Когда эта опция включена, она создает множество типов переменных (в том числе$_POST
, $_GET
и $_REQUEST
) регистрируются как глобальные переменные. Это легко сделает вашу программу неспособной эффективно определить источник данных и приведет к проблемам с безопасностью.
Например:$_GET['foo']
в состоянии пройти$foo
Accessed, то есть необъявленные переменные могут быть перезаписаны. Если вы используете версию PHP ниже 5.4.0, пожалуйста,удостовериться register_globals
установлен наoff из.
сообщение об ошибке
Журнал ошибок очень полезен для поиска ошибок в программе, но иногда он также раскрывает структуру приложения для внешнего мира. Чтобы эффективно защитить ваше приложение от проблем, вызванных этим. Вам нужно будет использовать две разные конфигурации для разработки и производства (онлайн) на вашем сервере.
среда разработки
для вразвиватьпоказать все возможные ошибки в окружении, разместитьphp.ini
Сделайте следующую конфигурацию:
установить значение на
-1
покажет все ошибки, даже новые типы и параметры, добавленные в будущих версиях PHP. Используется начиная с PHP 5.4E_ALL
Подобные. -php.net
E_STRICT
Ошибка типа была введена в 5.3.0 и не была включена вE_ALL
середина. Однако с версии 5.4.0 он включен вE_ALL
середина. что это значит? Это означает, что если вы хотите отобразить все сообщения об ошибках в 5.3, вам нужно использовать-1
или E_ALL | E_STRICT
.
Включить отображение всех ошибок в разных версиях PHP
- < 5.3
-1
илиE_ALL
- 5.3
-1
илиE_ALL | E_STRICT
-
5.3
-1
илиE_ALL
Производственная среда
для вПроизводствоСкройте отображение ошибок в среде, поместите свойphp.ini
Сделайте следующую конфигурацию:
При использовании этой конфигурации в продакшене сообщения об ошибках по-прежнему будут храниться в журнале ошибок веб-сервера, как обычно, с той лишь разницей, что они больше не будут отображаться пользователю. Для получения дополнительной информации о настройках обратитесь к руководству по PHP: