Ответ 1
Избегайте использования register_globals
Я только начинаю изучать PHP, я давно разрабатываю веб-приложения в ASP.Net. Мне было интересно, есть ли какие-либо ошибки PHP, специфические, которые я должен искать.
Итак, мой вопрос - вот какие советы по безопасности, которые должен знать каждый разработчик PHP.
Пожалуйста, держите его на один совет за каждый ответ, чтобы люди могли эффективно проголосовать.
Избегайте использования register_globals
(Без особого порядка)
РЕДАКТИРОВАТЬ: Для "новичков" там это основная причина (и, поскольку у меня есть время, чтобы объяснить это):
Регистрировать глобальные переменные является аберрацией. Это лучшая дыра в безопасности. Например, если register_globals включен, url http://www.yourdomain.com/foo.php?isAdmin=1 объявит $isAdmin как глобальную переменную без необходимого кода. Я не знаю, почему эта "особенность" проделала путь к PHP, но люди, стоящие за этим, должны иметь следующую татуировку на лбу: "Я изобрел PHP Register Globals", чтобы мы могли бежать от них, как вредители, когда мы см. их!
Волшебные кавычки - еще одна немая идея, которая сделала это способом PHP. В основном, когда ON PHP автоматически избегает кавычек ( "становиться" и "становиться" ), чтобы помочь с атаками SQL-инъекций. Концепция неплохая (помочь избежать атак атаки), но экранирование значений all GET, POST и COOKIE делает ваш код настолько сложным (например, каждый раз при отображении и данных приходится выполнять unescape). Плюс, если в один прекрасный день вы отключите этот параметр OFF, не внося никаких изменений в свой код, все ваши коды и/или данные будут разбиты и (даже более) уязвимы для инъекционных атак (да, даже когда ON вы уязвимы).
Данные ваших данных - ваша самая ценная вещь на вашем сайте. Вы не хотите, чтобы люди возились с ним, поэтому предохраняйте себя и читайте об этом и с учетом этого.
Снова это может привести к проблемам безопасности. Сообщение об ошибке может дать подсказки для взлома того, как работает ваш код. Кроме того, эти сообщения ничего не значат для ваших посетителей, поэтому зачем их сеять?
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 top 10.
Если вы используете базу данных mysql, убедитесь, что вы вызываете mysql_real_escape_string при отправке данных в базу данных
Существует множество мер предосторожности. Я могу порекомендовать книгу Криса Шифлетта: PHP и безопасность веб-приложений.
Посмотрите Suhosin Hardening Patch и проверьте уязвимости безопасности, которые он адресует.
Руководство PHPSec дает хороший обзор.
Большинство проблем безопасности, связанных с PHP, исходят из использования переменных unparsed "out" (GET/POST/COOKIE). Люди помещают такие данные непосредственно в пути к файлам или sql-запросы, что приводит к утечке файлов или SQL-инъекциям.
OWASP предоставляет много информации о проблемах безопасности, которые сегодня являются самыми большими проблемами в приложениях. Приятно видеть, что у них имеется специальная страница PHP
По возможности используйте подготовленные инструкции (учебник. Это почти необходимо, когда речь идет о пользовательском вводе (я говорю "почти", потому что есть несколько случаев использования, когда они не работают), и даже если они не имеют доступа к вводу, они сохраняют вас в привычке. Не говоря уже о том, что они могут привести к повышению производительности и намного легче, когда вы попадете в качели вещи, чем поэтапная дезинфекция.
Часто вводные учебники вообще не говорят о проверке данных от пользователей. Как и во всех средах программирования, никогда не доверяйте данным, которые вы получаете от пользователей. Научитесь использовать такие функции, как is_numeric()
, isset()
и mysql_real_escape_string()
для защиты вашей системы.
Есть также функции, которые позволяют вам обращаться к удаленным файлам и другим творческим вещам. Я бы избегал их, пока вы не поймете, как и когда они работают (часто они отключены по соображениям безопасности).
Всегда используйте POST, а не GET для важных данных...