При публикации информации из формы лучше использовать $ _REQUEST или $ _POST? - PullRequest
2 голосов
/ 27 октября 2008

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

Лучше использовать $_POST или $_REQUEST?

Вот фрагмент использования $_REQUEST

$message.= "Name: ".$_REQUEST["fname"]." ".$_REQUEST["mname"]." ".$_REQUEST["lname"]."\n";

Ответы [ 7 ]

7 голосов
/ 27 октября 2008

Раньше я подходил к использованию $ _ REQUEST для всего, что я считаю большой ошибкой. В последнее время я старался быть более усердным в использовании GET только для запросов на чтение и POST только для запросов на запись.

С этой целью, я думаю, использование $ _ GET для запросов GET и $ _ POST для запросов POST делает мои намерения намного более ясными в моем коде.

6 голосов
/ 27 октября 2008

Ответ: это зависит от того, как вы хотите, чтобы оно использовалось.

Если вы используете $_POST, это означает, что он может войти только через POST. Если вы используете $_REQUEST, это означает, что вы принимаете POST, GET (и COOKIE, но в основном это первые два, которые нас интересуют).

Для чего-то подобного, $_POST, вероятно, будет более аккуратным, но если бы вы создавали поисковую систему, то было бы неплохо разрешить настройку поискового URL. Тем не менее, вы можете захотеть разрешить тонну специальных параметров, чтобы сузить поиск, и если это может занять много места в URL, вы, вероятно, захотите разрешить и POSTDATA.

Как упоминает Дилан, имейте в виду, что ни одна из них не является заменой какой-либо безопасности.

1 голос
/ 27 октября 2008

Я только что прослушал Security Now эпизод # 166, в котором рассказывалось о подделке межсайтовых запросов, и в этом Стив хорошо обосновывает использование $_POST для форм, а не $_REQUEST. (Косвенно, он не говорит о самом PHP, но говорит, что вы не должны принимать как GET, так и POST для форм.) Причина в том, что легко использовать запросы GET для CSRF-атак, но не так просто использовать POST.

Использование $_POST само по себе не исключает возможности CSRF-атак, но снижает его. Стив также предлагает использовать в запросе криптографически сильное псевдослучайное скрытое поле, которое исключит возможность «слепых» запросов.

1 голос
/ 27 октября 2008

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

0 голосов
/ 29 октября 2008

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

Например, если у меня есть форма, которая должна изменить запись, я мог бы сначала передать идентификатор записи в URL как id = X. Поэтому при первой загрузке формы я мог использовать $ _GET ['id'], чтобы выяснить, какую запись мы пытаемся изменить.

Однако при отправке операции изменения форма должна быть POST, поскольку она будет изменять данные и не будет идемпотентной. В этом случае идентификатор записи будет доступен как $ _POST ['id'] при обработке отправки формы.

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

В подобных случаях я бы использовал $ _REQUEST ['id'] в логике отображения формы, чтобы она могла поддерживать любой сценарий. Но для обработки форм я бы использовал $ _POST ['id'] для строгой проверки.

0 голосов
/ 27 октября 2008

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

0 голосов
/ 27 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...