Мой приятель изучает PHP в настоящее время,
и он прислал мне свой PHP-код,
и я обнаружил, что он использует $ _REQUEST в своем коде.
В учебнике, который я читаю, говорится, что
У $ _REQUEST есть проблема безопасности, поэтому
нам лучше использовать $ _POST.
поэтому я ответил начальнику, что
нам лучше использовать $ _POST.
Это нормально?
Я бы сказал, что опасно характеризовать $ _POST более безопасным, чем $ _REQUEST.
Если данные не проверяются и не подвергаются санитарной обработке перед использованием, у вас есть возможный вектор атаки.
Короче: неважно, откуда поступают данные, если они не обрабатываются безопасным образом.
Ну, причина в том, что проблема $_COOKIE
, что она берет значения из $_GET
, $_POST
и $_COOKIE
, а это означает, что если вы каким-то образом $_COOKIE
вещи и делаете определенные недопустимые предположения для доверенных клиентов, злоумышленник может воспользуйтесь этим, поставив ценность в другом месте, чем вы ожидали, и переопределите ту, которую вы пытались пройти.
Это также означает, что вы, возможно, дали неверным указаниям вашего ханчмана, потому что это, возможно, было значением GET или COOKIE, которое он собирал из $_REQUEST
. Вам нужно будет использовать любое место, которое вы ищете фактически, а не обязательно $_POST
.
Как уже упоминалось в нескольких ответах: Любые данные, поступающие от клиента, не могут быть доверены и по умолчанию должны считаться вредоносными . Сюда входят $_POST
, $_GET
, $_COOKIE
и $_REQUEST
(комбинация первого), но и другие.
Говоря о том, что некоторые из них более опасны, чем другие, я бы действительно разделил $_GET
и $_REQUEST
(так как он включал $_GET
) из $_POST
, поскольку его немного сложнее сгенерировать, т. Е. Манипулировать, POST-запрос, чем запрос GET , Акцент здесь немного , но использование POST для чувствительных операций, по крайней мере, устраняет еще один слой плотных подвешенных фруктов для использования.
Особенно, когда речь идет о Cross Site Scripting (или XSS) и хищении файлов cookie, довольно легко заставить браузер жертвы выдавать GET-запрос серверу под атакой, просто вставляя скрытое изображение с помощью URL-адреса с манипулятором на страницу или ковку ссылка.
Выдача запроса POST по крайней мере требует некоторого JavaScript, который немного сложнее вводить в браузер пользователя для выполнения (в зависимости от ситуации). Очевидно, POST-запросы могут быть созданы злоумышленниками напрямую, поэтому им нельзя доверять, но для сценариев, когда злоумышленник проходит через сторонний браузер, их немного сложнее манипулировать.
Безопасность всегда заключается в том, чтобы как можно труднее разорвать ваше приложение – с учетом ограничений реализации и т. Д. Это никогда не может быть безопасным на 100%. Поэтому лучше всего выбрать альтернативу, которую сложно использовать, даже если разница незначительна , когда есть выбор между различными подходами к реализации.
В конце концов, это всегда об удалении низко висящих фруктов. Разумеется, запросы POST можно также манипулировать, но для любой операции с повышенным риском используйте запрос POST и ограничьте себя использованием $_POST
в коде. Таким образом, вы уже исключили некоторые очень легкие GET-атаки и теперь можете сосредоточиться на проверке ваших данных POST. Только не предполагайте, что использование POST внезапно сделало операцию безопасной по умолчанию.
Конечно, можно сказать, что люди используют $_POST
вместо $_REQUEST
. Всегда лучше быть более уверенным в том, где вы получаете свои данные.
@Christian:
Говоря о том, что некоторые из них более опасны, чем другие, я бы действительно разделил $ _GET и $ _REQUEST (так как он включал $ _GET) из $ _POST, поскольку его немного сложнее сгенерировать, т. Е. Манипулировать, POST-запрос, чем запрос GET , Акцент здесь немного, но использование POST для чувствительных операций, по крайней мере, устраняет еще один слой плотных подвешенных фруктов для использования.
Bzzt. Извините, но это неправда.
Любой, кто понимает разницу между GET и POST или как неактифицированные входы могут использоваться, не будет колебаться в течение секунды, чтобы запустить Tamper Data.
Некоторые люди имеют это прямо здесь: нет никакой безопасности, потерянной или полученной при использовании $ _REQUEST в хорошо продуманной системе.
Нет никакой реальной разницы в безопасности между использованием $_POST
и $_REQUEST
, вы должны дезинфицировать данные с равным контролем.
Самая большая проблема с $_REQUEST
заключается в том, что вы можете пытаться получить данные из POST'd-формы, но может иметь параметр GET с тем же именем. Откуда берутся данные? Лучше явно запрашивать данные из того, где вы ожидаете, $_POST
в этом примере
Есть небольшие преимущества в плане безопасности – проще выполнять атаки XSS (точнее, XSRF ) на параметры GET, что возможно, если вы используете $_REQUEST
, когда вам действительно нужны данные POST.
Очень мало ситуаций, когда вам нужны данные из POST, GET или cookie. Если вы хотите получить POST-данные, используйте $_POST
, если вы хотите получать данные из параметров GET, используйте $_GET
, если вы хотите данные cookie, использовать $_COOKIE
Самый безопасный способ – проверить и проверить данные. Обычно я генерирую случайный уникальный идентификатор для формы и сохраняю его в сеансе пользователя, но это легко обойти определенного атакующего. Гораздо лучше очистить все входящие данные. Проверьте htmlspecialchars () и связанную с ним функцию. Я также использую стороннюю утилиту для кросс-сайта, например, HTML Purfier
На некоторых практических заметках всегда используйте intval () то, что должно быть числовым, избегать всех входящих строк, использовать регулярное выражение для телефонных номеров, электронных писем или всего, что будет частью SQL-запроса.
Надеюсь это поможет.