Кроме того, что $_REQUEST
читает файлы cookie, есть ли причины, по которым я должен использовать $_GET
и $_POST
вместо $_REQUEST
? Каковы теоретические и практические причины для этого?
Я использую $ _REQUEST, когда просто хочу, чтобы определенные данные от пользователя возвращали определенные данные.
Никогда не используйте $ _REQUEST, когда запрос будет иметь побочные эффекты. Запросы, которые производят побочные эффекты, должны быть POST (по семантическим причинам, а также из-за базового материала CSRF ложный тег img может ударить по любой конечной точке GET, даже если пользователь не знает).
$ _GET следует использовать, когда GETing или POSTing на странице будут давать разные результаты.
Кроме того, что $ _REQUEST читает файлы cookie
Помимо того, что это не определено (он настраивается на уровне для каждой установки), проблема с использованием $_REQUEST
заключается в том, что он упрощает работу. Существует (или должна быть) семантическая разница между запросом GET и запросом POST. Таким образом, это должно иметь значение для вашего приложения, если вы получаете входной сигнал от одного источника или другого. Так определяется протокол HTTP, поэтому, игнорируя его, вы подрываете протокол, что делает ваше приложение менее функциональным. Это тот же аргумент типа, который можно использовать для использования семантической разметки HTML, а не для ориентированной на представление разметки. Или в более общем плане, следуя намерениям протокола, а не только тем, что работает в конкретной ситуации.
Вы уже дали один из ответов, поэтому я дам еще один:
Это скорее стилистический выбор. Например, вы обычно не хотите, чтобы информация, которая изменила состояние на сервере, была кэшируемой, поэтому вы, вероятно, захотите ограничить ее переменными $_POST
.
Использование $ _REQUEST открывает в вашем приложении векторы атаки, где переменные могут быть перезаписаны там, где вы не хотите, чтобы это произошло.
Также рассмотрите порядок GPC (Get, Post, Cookie), на котором будет заполнен $ _REQUEST.
т.е. запрос с:
$_GET['foo'] = 'bar' $_POST['foo'] = 'baz'
приведет к
$_REQUEST['foo'] == 'bar'
часто упоминаемая незащищенность $ _REQUEST является фиктивной. все это способы получить данные от пользователя, у которого есть незащищенная машина. вам всегда нужно санировать вход, поэтому нет никакого реального преимущества в плане безопасности от использования одного.
это очень важно, если у вас разные значения для значений с одинаковым именем на разных каналах. в этом случае вы должны переименовать некоторые из них в любом случае.
HTTP GET семантически предназначен для использования для извлечения страницы, в то время как в POST можно утверждать, что при использовании вы ожидаете, что какое-то состояние будет изменено.
Например, есть ожидание того, что использование GET с одинаковыми параметрами несколько раз дает одинаковые результаты при использовании POST, они могут и не быть.
Не использовать POST, когда вы должны уступать проблемам. Я думаю, что библиотеки Ruby on Rails AJAX использовали GET вместо POST и приводили к тому, что многие данные терялись при использовании веб-пауков.
Следовательно, вам, вероятно, следует избегать использования $ _REQUEST. Вы должны знать цели, что делает страница, и решать, как отвечать на запрос GET, и как отвечать на запрос POST.
Вот один, который я только что нашел: Когда и почему следует использовать $ _REQUEST вместо $ _GET / $ _POST / $ _COOKIE? , Мне жаль, что я не нашел его раньше, поэтому я бы не задал вопрос …