Статьи

Топ 7 ошибок безопасности PHP

Уязвимости SQL-инъекций

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

SELECT * FROM users WHERE name='$username' AND pass='$password'; 

Однако, если пользователь, который входит в систему, является хитрым, он может ввести следующее в качестве своего пароля:

 ' OR '1'='1 

Это приводит к тому, что запрос отправляется в базу данных как:

 SELECT * FROM users WHERE name='known_user' AND pass='' OR '1'='1'; 

Это вернет имя пользователя без подтверждения пароля — злоумышленник получил доступ к вашему приложению как пользователь по своему выбору. Чтобы решить эту проблему, вам необходимо экранировать опасные символы из значений, переданных пользователем, в особенности одиночные кавычки (‘). Самый простой способ сделать это — использовать функцию PHP addslashes() .

 $username = addslashes($_POST["username"]);  $password = addslashes($_POST["password"]); 

Но в зависимости от вашей конфигурации PHP, это может быть необязательно! В большинстве версий PHP функция многозначительных магических цитат в PHP включена по умолчанию. Эта функция, которую можно отключить, установив для переменной magic_quotes_gpc php.ini значение « Off , Автоматически применяет addslashes ко всем значениям, отправляемым с помощью GET, POST или файлов cookie. Эта функция защищает от неопытных разработчиков, которые в противном случае могли бы оставить дыры в безопасности, подобные описанной выше, но это оказывает неблагоприятное влияние на производительность, когда входные значения не нужно экранировать для использования в запросах к базе данных. Таким образом, большинство опытных разработчиков решили отключить эту функцию.

Если вы разрабатываете программное обеспечение, которое может быть установлено на общих серверах, где вы, возможно, не сможете изменить файл php.ini , используйте код, чтобы проверить этот статус magic_quotes_gpc и, если он включен, пропустить все входные значения через stripslashes() PHP stripslashes() функция. Затем вы можете применить addslashes() к любым значениям, предназначенным для использования в запросах к базе данных, как обычно.

 if (get_magic_quotes_gpc()){  $_GET = array_map('stripslashes', $_GET);  $_POST = array_map('stripslashes', $_POST);  $_COOKIE = array_map('stripslashes', $_COOKIE);  } 

Недостатки SQL-инъекций не всегда приводят к повышению привилегий. Например, они могут позволить злоумышленнику выводить выбранные записи базы данных, если результат запроса будет напечатан в ваш вывод HTML.

Вы должны всегда проверять предоставленные пользователем данные, которые будут использоваться в запросе для символов '",;() и, возможно, для ключевых слов "FROM" , "LIKE" и "WHERE" без учета регистра. Это символы и ключевые слова, которые полезны при атаке с вставкой SQL, поэтому если вы удалите их из пользовательских вводов, в которых они не нужны, у вас будет гораздо меньше поводов для беспокойства из-за этого недостатка.

Отчет об ошибках

Вы должны убедиться, что значение php.ini для display_errors установлено в «0». В противном случае любые ошибки, встречающиеся в вашем коде, такие как ошибки подключения к базе данных, будут выводиться в браузер конечного пользователя. Злоумышленник может использовать этот недостаток для получения информации о внутренней работе вашего приложения, просто предоставляя неверный ввод и читая сообщения об ошибках, которые в результате.

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

Вместо отображения ошибок установите переменную error_log ini в значение «1» и часто проверяйте журнал ошибок PHP на наличие ошибок. Кроме того, вы можете разработать свои собственные функции обработки ошибок, которые автоматически вызываются, когда PHP обнаруживает ошибку, и могут отправлять вам электронные письма или выполнять другой код PHP по вашему выбору. Это разумная мера предосторожности, поскольку вы будете уведомлены об ошибке и исправите ее, возможно, еще до того, как злоумышленники узнают, что проблема существует. Прочтите справочные страницы PHP по обработке ошибок и узнайте о функции set_error_handler() .

Ошибки обработки данных

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

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

Такой же тип риска может возникнуть при обновлении приложений с использованием FTP, который является небезопасным протоколом. Передача файла PHP, содержащего пароли базы данных, на удаленный веб-сервер по небезопасному протоколу, такому как FTP, может позволить перехватчику перехватывать пакеты и раскрывать ваш пароль. Всегда используйте безопасный протокол, такой как SFTP или SCP, для передачи конфиденциальных файлов. Никогда не разрешайте отправку конфиденциальной информации вашим приложением по электронной почте. Сообщение электронной почты доступно для чтения любому, кто способен читать сетевой трафик. Хорошее практическое правило заключается в том, что если вы не напишите информацию на обратной стороне открытки и не отправите ее по почте, вам также не следует отправлять ее по электронной почте. Вероятность того, что кто-то действительно перехватит сообщение, может быть низкой, но зачем рисковать?

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

Настройка PHP для безопасности

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

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

Некоторые параметры, которые следует учитывать при настройке PHP для обеспечения безопасности, включают:

  1. register_globals : бугменом безопасности PHP является register_globals , который использовался по умолчанию в «on» в более старых выпусках PHP, но с тех пор был изменен по умолчанию в «off». Он экспортирует весь пользовательский ввод как глобальные переменные. Проверьте эту настройку и отключите ее — без проблем, без исключений. Просто сделай это! Этот параметр, возможно, ответственен за большее количество недостатков безопасности PHP, чем любая другая причина. Если вы находитесь на общем хосте, и они не позволят вам отключить register_globals , получите новый хост!
  • safe_mode : настройка безопасного режима может быть очень полезна для предотвращения несанкционированного доступа к локальным системным файлам. Он работает, позволяя только чтение файлов, принадлежащих учетной записи пользователя, которому принадлежит исполняемый скрипт PHP. Если ваше приложение часто открывает локальные файлы, попробуйте включить этот параметр.
  • disable_functions : этот параметр можно установить только в файле php.ini, но не во время выполнения. Это может быть список функций, которые вы хотели бы отключить в вашей установке PHP. Это может помочь предотвратить возможное выполнение вредоносного кода PHP. Некоторые функции, которые полезно отключить, если вы их не используете, это system и exec, которые позволяют выполнять внешние программы.
  • Прочитайте раздел о безопасности в руководстве по PHP и узнайте его хорошо. Относитесь к нему как к материалу для теста, который вы пройдете, и узнайте его взад и вперед. Вы будете проверены на материале хакерами, которые, несомненно, попытаются проникнуть на ваш сайт. Вы получаете проходной балл по тесту, если хакеры сдаются и переходят к более легкой цели, чье понимание этих понятий недостаточно.

    Дальнейшее чтение

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

    OWASP, Open Security Application Project , является некоммерческой организацией, посвященной «поиску и устранению причин небезопасного программного обеспечения». Предоставляемые им ресурсы бесценны, и у группы есть много местных отделений, которые регулярно проводят встречи с семинарами и круглыми столами. Настоятельно рекомендуется.

    CGISecurity.Net — еще один хороший сайт, посвященный безопасности веб-приложений. У них есть несколько интересных вопросов и более подробной документации по некоторым типам недостатков, которые я обсуждал в этой статье.

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

    Консорциум PHP Security предлагает библиотеку со ссылками на другие полезные ресурсы, резюме по PHP для бюллетеней SecurityFocus, руководство по безопасности PHP и пару статей.

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

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

    Выводы

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

    Если вам понравилось читать этот пост, вы полюбите Learnable ; место, чтобы узнать новые навыки и приемы у мастеров. Участники получают мгновенный доступ ко всем электронным книгам и интерактивным онлайн-курсам SitePoint, таким как PHP и MySQL для веб-разработчиков для начинающих .

    Перейти на страницу: 1 | 2