Я только начинаю изучать PHP, я давно занимаюсь разработкой веб-приложений в ASP.Net. Мне было интересно, есть ли какие-либо ошибки безопасности PHP, которые я должен искать.
Итак, мой вопрос заключается в том, какие советы по безопасности, которые должен знать каждый разработчик PHP.
Пожалуйста, держите его на один совет за каждый ответ, чтобы люди могли эффективно проголосовать.
Избегайте использования register_globals
(В определенном порядке)
EDIT: для «новичков» там это принципиально, почему (и поскольку у меня есть время, чтобы объяснить это):
Регистрировать глобалы – это аберрация. Это лучшая дыра в безопасности. Например, если register_globals включен, URL-адрес http://www.yourdomain.com/foo.php?isAdmin=1 объявит $ isAdmin как глобальную переменную без кода. Я не знаю, почему эта «особенность» сделала свой путь к PHP, но люди, стоящие за этим, должны иметь следующую татуировку на лбу: «Я изобрел PHP Register Globals», чтобы мы могли бежать от них, как вредителей, когда мы их видим!
Магические кавычки – еще одна немая идея, которая сделала его способом для PHP. В основном, когда ON PHP автоматически избегает кавычек («становиться» и «становиться»), чтобы помочь с атаками SQL-инъекций. Концепция не плохая (помочь избежать атак атаки), но избежать всех значений GET, POST и COOKIE делает ваш код настолько сложным (например, каждый раз при отображении и данных нужно unescape). Плюс, если в один прекрасный день вы отключите этот параметр OFF без каких-либо изменений в коде, все ваши коды и / или данные будут разбиты и (даже более) уязвимы для инъекционных атак (да, даже когда вы уязвимы).
Данные ваших данных – ваша самая ценная вещь на вашем сайте. Вы не хотите, чтобы люди возились с ним, поэтому защищайте себя и читайте об этом и кодируйте это с учетом этого.
Опять же это может привести к проблемам безопасности. Сообщение об ошибке может дать подсказки для взлома того, как работает ваш код. Также эти сообщения ничего не значат для ваших посетителей, так зачем их сеять?
is_uploaded_file()
обязательно используйте is_uploaded_file()
для проверки того, что файл был загружен, и move_uploaded_file()
вместо copy()
или rename()
.
вот ссылка хорошей практики программирования безопасности PHP.
Большинство проблем безопасности вращаются вокруг пользовательского ввода (естественно) и удостоверяются, что они вас не винят. Всегда проверяйте правильность ввода.
http://htmlfixit.com/cgi-tutes/tutorial_PHP_Security_Issues.php
display_errors
в процессе производства не используйте «Регистрировать глобальные переменные» и фильтровать пользовательский ввод для xss и инъекций
Язык программирования Vs. Вы можете написать самую серьезную уязвимость, и вы не получите сообщение об ошибке или ошибке. Уязвимости могут быть такими же просто, как добавление или удаление 2 символов в вашем коде. Существуют сотни различных типов уязвимостей, которые влияют на PHP-приложения. Большинство людей думают о XSS и Sql Injection, потому что они самые популярные.
Прочтите верхнюю часть OWASP .
Если вы используете базу данных mysql, обязательно вызывайте mysql_real_escape_string при отправке данных в базу данных
Существует множество мер предосторожности. Я могу порекомендовать книгу Криса Шифлетта: PHP и безопасность веб-приложений.
Посмотрите на исправление Suhosin Hardening и проверьте уязвимости безопасности, которые он адресует .
Руководство PHPSec дает хороший обзор.
Большинство проблем безопасности, связанных с PHP, исходят от использования переменных unparsed «out» (GET / POST / COOKIE). Люди помещают такие данные непосредственно в пути к файлам или sql-запросы, что приводит к утечке файлов или SQL-инъекциям.
OWASP предоставляет много информации о проблемах безопасности, которые сегодня являются самыми большими проблемами в приложениях. Приятно видеть, что у них имеется специальная страница PHP
Когда это возможно, используйте подготовленные инструкции ( учебник . Это почти необходимо, когда речь идет о пользовательском вводе (я говорю «почти», потому что есть несколько случаев использования, когда они не работают), и даже когда они не работают с вводом, они удерживают вас в привычке. Не говоря уже о том, что они могут привести к повышению производительности, и намного легче, когда вы попадаете в качели вещей, чем поэтапная дезинфекция.
Часто вводные учебники вообще не говорят о проверке данных от пользователей. Как и во всех средах программирования, никогда не доверяйте данным, которые вы получаете от пользователей. Научитесь использовать такие функции, как is_numeric()
, isset()
и mysql_real_escape_string()
для защиты вашей системы.
Есть также функции, которые позволяют вам получать доступ к удаленным файлам и другим творческим вещам. Я бы избегал их, пока вы не поймете, как и когда они работают (часто они отключены по соображениям безопасности).
Всегда используйте POST, а не GET для важных данных …