Какие проблемы безопасности я должен высматривать в PHP

Я только начинаю изучать PHP, я давно занимаюсь разработкой веб-приложений на ASP.Net. Мне было интересно, есть ли какие-то специфические ошибки безопасности PHP, на которые мне следует обратить внимание.

Итак, мой вопрос: каковы основные советы по безопасности, которые должен знать каждый разработчик PHP?

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

18 ответов

(Без определенного порядка)

  1. Всегда проверяйте, что глобальные регистры выключены
  2. Всегда проверяйте, что магические кавычки выключены
  3. Убедитесь, что вы понимаете атаки SQL-инъекций
  4. Отключить отчеты об ошибках в производстве

РЕДАКТИРОВАТЬ: Для "новичков" это основная причина (и, так как у меня есть время, чтобы объяснить это):

  1. Регистр глобалов это аберрация. Это самая большая дыра в безопасности. Например, если включен register_globals, URL http://www.yourdomain.com/foo.php?isAdmin=1 объявит $isAdmin в качестве глобальной переменной без кода. Я не знаю, почему эта "особенность" попала в PHP, но люди, стоящие за этим, должны иметь татуировку на лбу: "Я изобрел глобальные регистры PHP", чтобы мы могли бежать от них, как вредители, когда увидим их!

  2. Волшебные кавычки - еще одна глупая идея, которая добралась до PHP. В основном, когда ПО PHP автоматически будет экранировать кавычки ("становиться" и "становиться"), чтобы помочь с атаками SQL-инъекций. Идея неплохая (помогите избежать атак с использованием инъекций), но экранирование всех значений GET, POST и COOKIE делает ваш код настолько сложным (например, каждый раз при отображении и данных приходится экранировать). Кроме того, если однажды вы отключите этот параметр, не внося никаких изменений в свой код, весь ваш код и / или данные будут повреждены и (что еще больше) уязвимы для атак с использованием инъекций (да, даже если ВКЛ вы уязвимы).

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

  4. Опять же, это может привести к проблемам безопасности. Сообщение об ошибке может дать подсказки хакерам о том, как работает ваш код. Также эти сообщения ничего не значат для ваших посетителей, так зачем показывать их?

Избегайте использования 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(),
  • Поскольку я уже дважды упомянул его, ознакомьтесь с ответом Рукса ( https://stackru.com/questions/2275771/what-are-the-most-important-safety-precautions-that-a-php-developer-needs-to-know), поскольку содержит ссылку на документ, который содержит (не специфичную для PHP) информацию о наиболее важных проблемах безопасности (и, следовательно, это, вероятно, правильный ответ).

Вот ссылка на хорошие практики программирования безопасности PHP.

http://phpsec.org/

Большинство проблем безопасности связаны с пользовательским вводом (естественно) и обеспечением того, чтобы они вас не обманули. Всегда проверяйте правильность ввода.

http://htmlfixit.com/cgi-tutes/tutorial_PHP_Security_Issues.php

  1. Всегда очищайте и проверяйте данные, передаваемые со страницы
  2. В сочетании с #1 всегда правильно экранируйте свой вывод
  3. Всегда поворачивай display_errors в производстве
  4. Если используется серверная часть БД, используйте драйвер, который поддерживает / эмулирует подготовленные операторы и использует их без ущерба:-)

Язык против программиста. Вы можете написать самую серьезную уязвимость, и вы не получите предупреждение или сообщение об ошибке. Уязвимости могут быть такими же простыми, как добавление или удаление 2 символов в вашем коде. Существуют сотни различных типов уязвимостей, которые влияют на приложения PHP. Большинство людей думают о XSS и Sql Injection, потому что они самые популярные.

Прочитайте OWASP топ 10.

Не используйте "Зарегистрировать глобальные переменные" и фильтруйте пользовательский ввод для xss и инъекций

Если вы используете базу данных mysql, обязательно вызывайте http://uk3.php.net/mysql_real_escape_string при отправке данных в базу данных

Есть множество мер предосторожности. Я могу порекомендовать книгу Криса Шифлетта: PHP и безопасность веб-приложений.

http://phpsecurity.org/

Руководство PHPSec дает хороший обзор.

Большинство проблем безопасности, связанных с PHP, возникают из-за использования непарсированных "внешних" (GET/POST/COOKIE) переменных. Люди помещают такие данные непосредственно в пути к файлам или в SQL-запросы, что приводит к утечке файлов или SQL-инъекциям.

  1. Всегда закрывайте SQL-соединение.
  2. Всегда выпускать результаты SQL.
  3. Всегда вычищайте все переменные, которые вы помещаете в базу данных.
  4. При удалении или удалении из SQL используйте предел 1 на всякий случай.
  5. При разработке убедитесь, что у вас есть блокировка вещей, чтобы избежать нежелательного. Если он открыт, и вы знаете, что не загружаете страницу прямо сейчас, потому что она может что-то сломать, это не значит, что другие люди это делают.
  6. Никогда не используйте Admin или Root в качестве имени входа вашего сервера.

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

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

http://www.owasp.org/index.php/PHP_Top_5

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

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

Используйте метод POST для передачи данных с одной страницы на другую.

Используйте обрезку при получении данных, как trim($_POST), Также используйте strip_tags для переменных, прежде чем перейти в запросах.

Я предлагаю вам использовать любые фреймворк-ссылки Codeigniter, Laravel, YII, Cake PHP, потому что они делают фреймворк со всеми ценными бумагами

Я предлагаю Codeigniter для небольших проектов и Laravel для больших проектов.

Всегда используйте POST, а не GET для важных данных...

Другие вопросы по тегам