Какие проблемы безопасности я должен высматривать в PHP
Я только начинаю изучать PHP, я давно занимаюсь разработкой веб-приложений на ASP.Net. Мне было интересно, есть ли какие-то специфические ошибки безопасности PHP, на которые мне следует обратить внимание.
Итак, мой вопрос: каковы основные советы по безопасности, которые должен знать каждый разработчик PHP?
Пожалуйста, держите его по одному совету за ответ, чтобы люди могли эффективно голосовать за / против.
18 ответов
(Без определенного порядка)
- Всегда проверяйте, что глобальные регистры выключены
- Всегда проверяйте, что магические кавычки выключены
- Убедитесь, что вы понимаете атаки SQL-инъекций
- Отключить отчеты об ошибках в производстве
РЕДАКТИРОВАТЬ: Для "новичков" это основная причина (и, так как у меня есть время, чтобы объяснить это):
Регистр глобалов это аберрация. Это самая большая дыра в безопасности. Например, если включен register_globals, URL http://www.yourdomain.com/foo.php?isAdmin=1 объявит $isAdmin в качестве глобальной переменной без кода. Я не знаю, почему эта "особенность" попала в PHP, но люди, стоящие за этим, должны иметь татуировку на лбу: "Я изобрел глобальные регистры PHP", чтобы мы могли бежать от них, как вредители, когда увидим их!
Волшебные кавычки - еще одна глупая идея, которая добралась до PHP. В основном, когда ПО PHP автоматически будет экранировать кавычки ("становиться" и "становиться"), чтобы помочь с атаками SQL-инъекций. Идея неплохая (помогите избежать атак с использованием инъекций), но экранирование всех значений GET, POST и COOKIE делает ваш код настолько сложным (например, каждый раз при отображении и данных приходится экранировать). Кроме того, если однажды вы отключите этот параметр, не внося никаких изменений в свой код, весь ваш код и / или данные будут повреждены и (что еще больше) уязвимы для атак с использованием инъекций (да, даже если ВКЛ вы уязвимы).
Ваши данные базы данных - ваша самая ценная вещь на вашем сайте. Вы не хотите, чтобы люди вмешивались в это, поэтому защитите себя, прочитайте что-нибудь об этом и пишите с учетом этого.
Опять же, это может привести к проблемам безопасности. Сообщение об ошибке может дать подсказки хакерам о том, как работает ваш код. Также эти сообщения ничего не значат для ваших посетителей, так зачем показывать их?
Избегайте использования register_globals.
Предупреждение: эта функция УСТАРЕЛА с PHP 5.3.0 и УДАЛЕНА с PHP 5.4.0.
- Межсайтовый скриптинг (XSS) Wiki, Google
- Подделка межсайтовых запросов (XSRF / CSRF) Wiki, Google (спасибо Rook)
- SQL-инъекция (SQLi) Wiki, Google
- Отключить сообщения об ошибках в производственной среде
- Храните любой код "include" в каталоге, который недоступен через Интернет (либо запретите доступ, либо не размещайте его вне webroot)
- Вот статья о безопасном хранении паролей, которую я написал, и, если вы не хотите поверить мне на слово, проверьте ссылки внизу.
- В моей статье также приведена ссылка, но здесь есть отдельная ссылка, опубликованная MIT под названием "ЗАПРЕЩАЕТСЯ и не делаются проверки подлинности клиента в Интернете" [PDF]. Хотя некоторая информация (например, рекомендация использовать MD5-хэш) несколько устарела просто из-за того, что мы знаем сейчас, а не того, что мы знали тогда, общие принципы очень сильны и должны быть рассмотрены.
- Одна из ссылок Rooks напомнила мне о другом важном наборе ограничений
- Отключить регистр глобалов (сейчас это значение по умолчанию, поэтому я не упоминал об этом раньше)
- При загрузке файлов обязательно используйте
is_uploaded_file()
проверить, что файл был загружен иmove_uploaded_file()
вместоcopy()
или жеrename()
,- Прочтите этот раздел Руководства по PHP, если вам нужно знать, почему (и вы это делаете).
- Поскольку я уже дважды упомянул его, ознакомьтесь с ответом Рукса ( https://stackru.com/questions/2275771/what-are-the-most-important-safety-precautions-that-a-php-developer-needs-to-know), поскольку содержит ссылку на документ, который содержит (не специфичную для PHP) информацию о наиболее важных проблемах безопасности (и, следовательно, это, вероятно, правильный ответ).
Вот ссылка на хорошие практики программирования безопасности PHP.
Большинство проблем безопасности связаны с пользовательским вводом (естественно) и обеспечением того, чтобы они вас не обманули. Всегда проверяйте правильность ввода.
http://htmlfixit.com/cgi-tutes/tutorial_PHP_Security_Issues.php
- Всегда очищайте и проверяйте данные, передаваемые со страницы
- В сочетании с #1 всегда правильно экранируйте свой вывод
- Всегда поворачивай
display_errors
в производстве - Если используется серверная часть БД, используйте драйвер, который поддерживает / эмулирует подготовленные операторы и использует их без ущерба:-)
Язык против программиста. Вы можете написать самую серьезную уязвимость, и вы не получите предупреждение или сообщение об ошибке. Уязвимости могут быть такими же простыми, как добавление или удаление 2 символов в вашем коде. Существуют сотни различных типов уязвимостей, которые влияют на приложения PHP. Большинство людей думают о XSS и Sql Injection, потому что они самые популярные.
Прочитайте OWASP топ 10.
Не используйте "Зарегистрировать глобальные переменные" и фильтруйте пользовательский ввод для xss и инъекций
Если вы используете базу данных mysql, обязательно вызывайте http://uk3.php.net/mysql_real_escape_string при отправке данных в базу данных
Есть множество мер предосторожности. Я могу порекомендовать книгу Криса Шифлетта: PHP и безопасность веб-приложений.
Взгляните на исправление Suhosin Hardening Patch и проверьте уязвимости в безопасности, которые оно устраняет.
Большинство проблем безопасности, связанных с PHP, возникают из-за использования непарсированных "внешних" (GET/POST/COOKIE) переменных. Люди помещают такие данные непосредственно в пути к файлам или в SQL-запросы, что приводит к утечке файлов или SQL-инъекциям.
- Всегда закрывайте SQL-соединение.
- Всегда выпускать результаты SQL.
- Всегда вычищайте все переменные, которые вы помещаете в базу данных.
- При удалении или удалении из SQL используйте предел 1 на всякий случай.
- При разработке убедитесь, что у вас есть блокировка вещей, чтобы избежать нежелательного. Если он открыт, и вы знаете, что не загружаете страницу прямо сейчас, потому что она может что-то сломать, это не значит, что другие люди это делают.
- Никогда не используйте Admin или Root в качестве имени входа вашего сервера.
Когда бы ни было возможно, используйте подготовленные операторы ( учебник. Это почти обязательно, когда имеешь дело с пользовательским вводом (я говорю "почти", потому что есть несколько случаев использования, когда они не работают), и даже когда не имеют дело с вводом, они держат вас в привычке. Не говоря уже о том, что они могут привести к лучшей производительности, и намного легче, когда вы попадаете в суть событий, чем частичная дезинфекция.
OWASP обеспечивает глубокое понимание проблем безопасности, которые сегодня являются самыми большими проблемами в приложениях. Приятно видеть, что у них есть выделенная страница PHP
Часто вводные уроки не говорят вообще о проверке данных от пользователей. Как и во всех средах программирования, никогда не доверяйте данным, которые вы получаете от пользователей. Научитесь использовать такие функции, как is_numeric()
, isset()
, а также mysql_real_escape_string()
чтобы защитить вашу систему.
Есть также функции, которые позволяют вам получить доступ к удаленным файлам и другим творческим вещам. Я буду избегать их до тех пор, пока вы не поймете, как и когда они работают (часто они отключены по соображениям безопасности).
Используйте метод POST для передачи данных с одной страницы на другую.
Используйте обрезку при получении данных, как trim($_POST)
, Также используйте strip_tags
для переменных, прежде чем перейти в запросах.
Я предлагаю вам использовать любые фреймворк-ссылки Codeigniter, Laravel, YII, Cake PHP, потому что они делают фреймворк со всеми ценными бумагами
Я предлагаю Codeigniter для небольших проектов и Laravel для больших проектов.