Почему я должен использовать $ _GET и $ _POST вместо $ _REQUEST?

Помимо того факта, что $_REQUEST считывает файлы cookie, есть ли какие-либо причины, по которым я должен использовать $_GET и $_POST вместо $_REQUEST? Каковы теоретические и практические причины для этого?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
0
4 826
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Использование $ _REQUEST открывает некоторые векторы атаки для вашего приложения, где переменные могут быть перезаписаны там, где вы бы этого не хотели.

Также рассмотрите порядок GPC (Get, Post, Cookie), в котором будет заполнен $ _REQUEST.

то есть запрос с:

$_GET['foo'] = 'bar'
$_POST['foo'] = 'baz'

приведет к

$_REQUEST['foo'] == 'bar'

Обратите внимание, что вы можете изменить порядок заполнения переменной запроса, если вы управляете php.ini.

gnud 15.12.2008 16:24

Это только я, или POST будет идти после GET в вашем примере, поэтому содержимое переменной будет перезаписано? Не уверен, поэтому и спрашиваю ...

Franz 18.12.2009 01:17

Вы уже дали один из ответов, поэтому я дам другой:

Это скорее стилистический выбор. Например, обычно вы не хотите, чтобы информация, которая изменяет состояние на сервере, кэшировалась, поэтому вы, вероятно, захотите ограничить ее переменными $_POST.

Отличный ответ! Я надеюсь увидеть их больше.

Tom 15.12.2008 16:54

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

это важно только в том случае, если вы по-разному используете значения с одинаковыми именами на разных каналах. в этом случае вам все равно следует переименовать некоторые из них.

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

TravisO 15.12.2008 20:00

Besides the fact that $_REQUEST reads from cookies

Помимо того факта, что он не определен (он настраивается на уровне установки), проблема с использованием $_REQUEST заключается в том, что он чрезмерно упрощает вещи. Существует (или должна быть) семантическая разница между запросом GET и запросом POST. Таким образом, для вашего приложения должно иметь значение, получаете ли вы ввод из того или иного источника. Так определяется протокол HTTP, поэтому, игнорируя его, вы подрываете протокол, что делает ваше приложение менее совместимым. Это аргумент того же типа, который можно использовать для использования семантической разметки HTML, а не разметки, ориентированной на представление. Или, в более общем плане, следование намерениям протокола, а не просто выполнение того, что работает в конкретной ситуации.

Here's one I've just found: Когда и почему следует использовать $ _REQUEST вместо $ _GET / $ _POST / $ _COOKIE?. Мне жаль, что я не нашел его раньше, поэтому не стал бы задавать вопрос ...

Ответ принят как подходящий

Я использую $ _REQUEST, когда мне просто нужно, чтобы определенные данные от пользователя возвращали определенные данные.

Никогда не используйте $ _REQUEST, если запрос будет иметь побочные эффекты. Запросы, которые вызывают побочные эффекты, должны быть POST (по семантическим причинам, а также из-за базового материала CSRF ложный тег img может поразить любую конечную точку GET без ведома пользователя).

$ _GET следует использовать, когда GETing или POSTing на страницу будут давать разные результаты.

Поздравляем, вы только что получили свой первый принятый ответ :) Добро пожаловать на stackoverflow.com!

Tom 16.12.2008 14:06

HTTP GET семантически предназначен для использования для выборки страницы, в то время как POST можно утверждать, что при использовании можно ожидать, что какое-то состояние изменится.

Например, ожидается, что многократное использование GET с одними и теми же параметрами даст одни и те же результаты, а при использовании POST - нет.

Не использовать POST, когда вы должны уступить место проблемам. Я думаю, что библиотеки AJAX Ruby on Rails использовали GET вместо POST и приводили к потере большого количества данных, когда их касались веб-пауки.

Следовательно, вам, вероятно, следует избегать использования $ _REQUEST. Вы должны знать цели того, что делает страница, и решить, как ответить на запрос GET и как ответить на запрос POST.

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