У проблемы $_REQUEST проблемы с безопасностью?

Мой приятель изучает PHP в настоящее время,
и он прислал мне свой PHP-код,
и я обнаружил, что он использует $_REQUEST в своем коде.

В учебнике, который я читаю, говорится, что $ _REQUEST имеет проблему безопасности, так что нам лучше использовать $_POST.

поэтому я ответил начальнику, что нам лучше использовать $_POST.

Это нормально?

Ответ 1

Я бы сказал, что опасно характеризовать $_POST более безопасным, чем $_REQUEST.

Если данные не проверяются и не подвергаются санитарной обработке перед использованием, у вас есть возможный вектор атаки.

Вкратце: Не важно, откуда поступают данные, если он не обрабатывается безопасным образом.

Ответ 2

Ну, причина, по которой $_REQUEST имеет проблемы, заключается в том, что она выбирает значения из $_GET, $_POST и $_COOKIE, что означает, что если вы кодируете вещи определенным образом и делаете определенные недопустимые доверительные отношения, клиентские допущения, злоумышленник может воспользоваться этим, предоставив значение в другом месте, чем вы ожидали, и переопределив тот, который вы пытались передать.

Это также означает, что вы, возможно, дали неверным указаниям вашего прихвостника, потому что это может быть значение GET или COOKIE, которое он собирал из $_REQUEST. Вам нужно будет использовать любое место, которое действительно имеет значение, которое вы ищете, а не обязательно $_POST.

Ответ 3

Как уже упоминалось в нескольких ответах: Любые данные, поступающие от клиента, не могут быть доверены и по умолчанию считаются вредоносными. Это включает в себя $_POST, $_GET, $_COOKIE и $_REQUEST (комбинация первого), но и другие.

Говоря о том, что некоторые из них более опасны, чем другие, я бы действительно разделил $_GET и $_REQUEST (так как он включает $_GET) из $_POST, поскольку его немного сложнее сгенерировать, т.е. манипулировать, запрос POST, чем запрос GET. Акцент здесь слегка, но использование POST для чувствительных операций, по крайней мере, удаляет другой слой с плотными плодами, которые можно использовать для использования.

Особенно, когда речь заходит о Скрипт Cross Site (или XSS) и кража файлов cookie, довольно легко получить броузер для броузера GET-запрос к серверу под атакой, просто вставив скрытое изображение с помощью URL-адреса на страницу или подделав ссылку.

Для выдачи запроса POST требуется, по крайней мере, некоторый JavaScript, который слегка сложнее вводить в браузер пользователя для выполнения (в зависимости от ситуации). Очевидно, POST-запросы могут генерироваться злоумышленниками напрямую, поэтому им нельзя доверять, но для сценариев, когда злоумышленник проходит через сторонний браузер, их немного сложнее манипулировать.

Безопасность всегда заключается в том, чтобы как можно труднее разорвать ваше приложение - с учетом ограничений реализации и т.д. Это никогда не может быть безопасным на 100%. Поэтому лучше выбрать альтернативу, которую сложнее использовать, даже если разница является маргинальной, когда есть выбор между различными подходами к реализации.

В конце концов, это всегда об удалении низко висящих фруктов. Разумеется, запросы POST можно также манипулировать, но для любой операции с повышенным риском используйте запрос POST и ограничьте себя использованием $_POST в вашем коде. Таким образом, вы уже исключили некоторые очень легкие GET-атаки и теперь можете сосредоточиться на проверке ваших данных POST. Только не думайте, что использование POST внезапно сделало операцию безопасной по умолчанию.

Ответ 4

Конечно, можно сказать, что люди используют $_POST вместо $_REQUEST. Всегда лучше быть более уверенным в том, где вы получаете свои данные.

Ответ 5

@Christian:

Говоря о том, что некоторые из них более опасны, чем другие, я бы действительно разделил $_GET и $_REQUEST (включая $_GET) из $_POST, поскольку его немного сложнее сгенерировать, т.е. манипулировать, POST-запрос, чем запрос GET. Упор здесь немного, но использование POST для чувствительных операций, по крайней мере, устраняет другой слой плотных плотных плодов для использования.

Bzzt. Извините, но это неправда.

Любой, кто понимает разницу между GET и POST, или как небезопасные входы могут использоваться, не будет колебаться в течение секунды, чтобы запустить Tamper Data.

Некоторые люди имеют это прямо здесь: нет никакой безопасности, потерянной или полученной при использовании $_REQUEST в хорошо продуманной системе.

Ответ 6

Не существует реальной разницы в безопасности между использованием $_POST и $_REQUEST, вы должны тщательно анализировать данные с равным контролем.

Самая большая проблема с $_REQUEST заключается в том, что вы можете пытаться получить данные из POST'd-формы, но может иметь параметр GET с тем же именем. Откуда берутся данные? Лучше явно запрашивать данные из ожидаемого, $_POST в этом примере

Есть небольшие преимущества в плане безопасности - проще выполнить XSS (более конкретно XSRF) атаки на параметры GET, что возможно, если вы используете $_REQUEST, когда вам действительно нужны данные POST.

Очень мало ситуаций, когда вам нужны данные из POST, GET или cookie. Если вы хотите получить POST-данные, используйте $_POST, если вы хотите получить данные из параметров GET, используйте $_GET, если вы хотите данные cookie, используйте $_COOKIE

Ответ 7

Самый безопасный способ - проверить и проверить данные. Обычно я генерирую случайный уникальный идентификатор для формы и сохраняю его в сеансе пользователя, но это легко обойти определенного атакующего. Гораздо лучше очистить все входящие данные. Проверьте htmlspecialchars() и связанную с ним функцию. Я также использую стороннюю утилиту для кросс-сайта, например HTML Purfier

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

Надеюсь, что это поможет.