Расскажите о веб-безопасности

задняя часть база данных PHP Безопасность

Злоумышленники всегда готовы атаковать ваше веб-приложение, поэтому очень важно повысить безопасность вашего веб-приложения. К счастью, изОткрытый проект безопасности веб-приложенийРебята из (OWASP) составили исчерпывающий список известных проблем с безопасностью и способы защиты от них. Этот контрольный список обязателен к прочтению разработчиками, заботящимися о безопасности. Падраик БрэдиРуководство по выживанию: Безопасность PHPЭто также очень хороший материал для чтения по безопасности PHP.

хэш пароля

Все заканчивают тем, что добавляют модуль входа пользователя при создании приложения PHP. Учетная запись пользователя и пароль хранятся в базе данных и используются для аутентификации пользователя при входе в систему.

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

Пароли должны быть индивидуальнымилечение солью, соление означает добавление случайных подстрок перед хешированием. Это защищает от «взлома словаря» или «радужных коллизий» (база данных паролей, в которой хранятся универсальные хэши, которые можно использовать для обратного проектирования паролей).

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

К счастью, это легко сделать в PHP.

использовать password_hashхешировать пароль

password_hashФункция была представлена ​​в PHP 5.5. Эта функция теперь использует BCrypt, самый надежный алгоритм шифрования, который в настоящее время поддерживается PHP. Конечно, в будущем эта функция будет поддерживать больше алгоритмов шифрования. password_compatВ библиотеке появилась поддержка версий PHP >= 5.3.7.

В следующем примере мы хэшируем строку и сравниваем ее с новым хеш-значением. Не удалось войти в систему, потому что две строки, которые мы использовали, были разными («секретный пароль» и «неверный пароль»).

<?php
require 'password.php';

$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    // Correct Password
} else {
    // Wrong password
}

password_hash()С засолкой уже разобрались за вас. Добавленная случайная подстрока автоматически сохраняется алгоритмом шифрования и становится частью хэша.password_verify()будет извлекать из него случайные подстроки, поэтому вам не нужно использовать другую базу данных для отслеживания этих случайных подстрок.

Фильтрация данных

Никогда не доверяйте внешнему вводу. Пожалуйста, отфильтруйте и проверьте перед использованием внешнего ввода.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()функция для фильтрации параметров выполняемой команды.

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

очистка данных

Очистка данных относится к удалению (или экранированию) недопустимых и небезопасных символов из внешнего ввода.

Например, вам нужно отфильтровать внешний ввод, прежде чем включать его в 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']в состоянии пройти$fooAccessed, то есть необъявленные переменные могут быть перезаписаны. Если вы используете версию PHP ниже 5.4.0, пожалуйста,удостовериться register_globalsустановлен наoff из.

сообщение об ошибке

Журнал ошибок очень полезен для поиска ошибок в программе, но иногда он также раскрывает структуру приложения для внешнего мира. Чтобы эффективно защитить ваше приложение от проблем, вызванных этим. Вам нужно будет использовать две разные конфигурации для разработки и производства (онлайн) на вашем сервере.

среда разработки

для вразвиватьпоказать все возможные ошибки в окружении, разместитьphp.iniСделайте следующую конфигурацию:

display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On

установить значение на-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Сделайте следующую конфигурацию:

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On

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