Статьи

Топ 10 уязвимостей в PHP безопасности

Безопасность — это не список того, что вы делаете. Безопасность — это способ мышления, способ взглянуть на вещи, способ общения с миром, который говорит: «Я не знаю, как они это сделают, но я знаю, что они попытаются меня подставить» и затем, вместо того, чтобы раствориться в экзистенциальном фанке, проявить инициативу, чтобы предотвратить проблему.

Но вы не можете противостоять статистике. Никто не собирается читать статью под названием «Кодирование для безопасности». Всем нужна статья с номером в ней: «8 самых распространенных атак безопасности PHP и как их избежать», «23 вещи, которые нельзя сказать супер модели» и «15 причин избежать радиационного отравления». Итак, «10 самых уязвимых мест безопасности PHP».

SQL-инъекция

Номер один в списке попаданий — атака SQL-инъекцией. В этом случае кто-то вводит фрагмент SQL (классический пример — оператор отбрасывания базы данных, хотя есть много возможностей, которые не включают в себя удаления, которые могут быть столь же разрушительными), в качестве значения в вашем URL или веб-форме. Не берите в голову, как он знает, как называются ваши таблицы; это совсем другая проблема. Вы имеете дело с коварным и находчивым противником.

Итак, что вы можете сделать, чтобы избежать этого? Прежде всего, вам нужно с подозрением относиться к любым данным, которые вы принимаете от пользователя. Поверьте, все хорошо? Просто посмотрите на семью вашего супруга … они странные и странные, некоторые опасно.

Чтобы предотвратить подобные вещи, используйте подготовленные операторы PDO. Я не хочу проходить полное обсуждение PDO сейчас. Достаточно сказать, что подготовленные заявления отделяют данные от инструкций. При этом он предотвращает обращение с данными как с чем-либо, кроме данных. Для получения дополнительной информации вы можете прочитать статью Тимоти Борончик ( Mothrate from MySQL Extension to PDO ).

XSS (межсайтовый скриптинг)

Прокляните чёрные сердца, которые процветают на этом типе обмана. Родители, поговорите с вами сегодня, дети, чтобы они не стали злыми XSS’ерами!

Суть любой атаки XSS — это внедрение кода (обычно кода JavaScript, но это может быть любой код на стороне клиента) в вывод вашего сценария PHP. Эта атака возможна, когда вы отображаете данные, которые были отправлены вам, например, как если бы вы делали сообщения на форуме. Злоумышленник может опубликовать в своем сообщении код JavaScript, который делает невероятные вещи на вашем сайте. Пожалуйста, не заставляй меня вдаваться в детали; мое сердце плачет от того, на что способны эти разбойники.

Для получения дополнительной информации и как защитить себя, я предлагаю прочитать эти прекрасные статьи на PHPMaster:

Откровение исходного кода

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

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

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

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

Удаленное включение файлов

Подождите, пока я пытаюсь объяснить это: удаленное включение файлов — это когда удаленные файлы включаются в ваше приложение. Довольно глубоко, а? Но почему это проблема? Потому что удаленный файл не заслуживает доверия. Он мог быть злонамеренно изменен, чтобы содержать код, который вы не хотите запускать в своем приложении.

Предположим, у вас есть ситуация, когда на вашем сайте www.myplace.com есть библиотека www.goodpeople.com/script.php. Однажды ночью www.goodpeople.com скомпрометирован и содержимое файла заменено злым кодом, который испортит ваше приложение. Затем кто-то заходит на ваш сайт, вы извлекаете обновленный код, и Бэм! Так как же это остановить?

К счастью, исправить это относительно просто. Все, что вам нужно сделать, это зайти на ваш php.ini и проверить настройки этих флагов.

  • allow_url_fopen — указывает, могут ли быть включены внешние файлы. По умолчанию это значение включено, но вы хотите отключить его.
  • allow_url_include — указывает, могут ли функции include() , require() , include_once() и require_once () ссылаться на удаленные файлы. По умолчанию это отключено, и отключение allow_url_fopen отключает это тоже.

Session Hijacking

Перехват сеанса — это когда негодяй крадет и использует чужой идентификатор сеанса, который является чем-то вроде ключа от сейфа. Когда между клиентом и веб-сервером устанавливается сеанс, PHP сохранит идентификатор сеанса в файле cookie на стороне клиента, который, вероятно, называется PHPSESSID. Отправка идентификатора с запросом страницы дает вам доступ к информации о сеансе, сохраненной на сервере (который заполняет $_SESSION массив $_SESSION ).

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

Так как же люди крадут эти сессионные идентификаторы и что могут с этим сделать порядочные, богобоязненные люди, такие как мы?

Идентификаторы сессий обычно крадут с помощью атаки XSS, поэтому предотвращение их — это хорошая вещь, которая дает двойную выгоду. Также важно менять идентификатор сессии так часто, как это практически возможно. Это уменьшает ваше окно кражи. Из PHP вы можете запустить функцию session_regenerate_id() чтобы изменить идентификатор сессии и уведомить клиента.

Для тех, кто использует PHP5.2 и выше (да, не так ли?), Есть настройка php.ini , которая препятствует предоставлению JavaScript доступа к идентификатору сеанса ( session.cookie.httponly ). Или вы можете использовать функцию session_set_cookie_parms() .

Идентификаторы сеансов также могут быть уязвимы на стороне сервера, если вы используете службы общего хостинга, которые хранят информацию о сеансах в глобально доступных каталогах, таких как /tmp . Вы можете заблокировать проблему, просто сохранив идентификатор сеанса в месте, доступном только для ваших сценариев, либо на диске, либо в базе данных.

Подделка межсайтовых запросов

Подделка межсайтовых запросов (CSRF), также известная как Brett Maverick или Shawn Spencer, Gambit, включает в себя обман довольно невольного пользователя в выдаче запроса, который, скажем так, не отвечает его наилучшим интересам. Но вместо того, чтобы продолжать рассказывать о CSRF-атаках, обратимся к выдающемуся примеру того, какой именно контент мы имеем здесь на PHPMaster: Предотвращение подделок межсайтовых запросов от Мартина Псинаса.

Обратный путь в каталогах

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

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

Резюме

Это 10 основных проблем, которые, если вы не будете осторожны, могут привести к нарушению вашего PHP-приложения. Да, 10. Посчитай их … 1, 2, 3 … Что? Вы только насчитали 8? Хорошо, может быть 7. Ну, тогда это показывает, насколько легко тебя можно одурачить, и я даже не один из плохих парней!

Изображение через Fotolia