Обработка ввода с помощью Zend Framework (Post, Get и т. Д.) - PullRequest
23 голосов
/ 19 января 2009

Я перефакторинг php на Zend-коде, и весь код заполнен $_GET["this"] и $_POST["that"]. Я всегда использовал больше phpish $this->_request->getPost('this') и $this->_request->getQuery('that') (этот не так логичен с getquery вместо getGet).

Так что мне было интересно, был ли мой метод безопаснее / лучше / легче в обслуживании. Я прочитал в документации Zend Framework, что вы должны проверить свой собственный ввод, так как объект запроса не сделает этого.

Это оставляет мне 2 вопроса:

  • Что лучше из этих двух? (или если есть другой лучший способ)
  • Какова лучшая практика для проверки ввода php с помощью этих методов?

Спасибо!

Ответы [ 6 ]

34 голосов
/ 19 января 2009

Я обычно использую $ this -> _ request-> getParams (); чтобы получить либо сообщение, либо параметры URL. Затем я использую Zend_Filter_Input для проверки и фильтрации. GetParams () не выполняет проверку.

Используя Zend_Filter_Input, вы можете выполнять валидацию на уровне приложения, используя Zend Validators (или вы тоже можете написать свой) Например, вы можете убедиться, что поле 'months' является числом:

$data = $this->_request->getParams();

$validators = array(
    'month'   => 'Digits',
);

$input = new Zend_Filter_Input($filters, $validators, $data);
10 голосов
/ 21 января 2009

Расширяя ответ Брайана.

Как вы заметили, вы также можете проверить $this->_request->getPost() и $this->_request->getQuery(). Если вы обобщите getParams(), это все равно что использовать $_REQUEST суперглобальный, и я не думаю, что это приемлемо с точки зрения безопасности.

В дополнение к Zend_Filter вы также можете использовать простой PHP для приведения необходимого значения.

Например:

$id = (int) $this->_request->getQuery('id');

Для других значений это усложняется, поэтому убедитесь, что, например, указывайте в запросах к вашей БД ( Zend_Db , см. идентификаторы цитирования, $db->quoteIdentifier()) и в представлениях используйте $this->escape($var); для экранирования содержимого.

6 голосов
/ 19 января 2009

Вы не можете написать универсальную функцию проверки для получения / публикации данных. Как и в некоторых случаях, вы требуете, чтобы поле было целым числом, а в других - например, датой. Вот почему в Zend Framework нет проверки входных данных.

Вам нужно будет написать проверочный код в том месте, где он вам нужен. Конечно, вы можете написать несколько вспомогательных методов, но вы не можете ожидать, что getPost () сам проверит что-то для вас ...

И это даже не место getPost / getQuery для проверки чего-либо, его задача - доставить вам данные, которые вам не нужны, то, что с ними происходит, не должно вызывать беспокойства.

2 голосов
/ 21 ноября 2012
$dataGet  = $this->getRequest()->getParam('id',null);
$valid = new Zend_Validate_Digits();

if( isset($dataGet) && $valid->isValid($dataGet) ){
 // do some...
} else{
  // not set
}
1 голос
/ 19 мая 2009

не имеет прямого отношения к теме, но чтобы убедиться, что вы получили число на входе, можно также использовать $ var + 0 (однако если переменная $ var является плавающей точкой, она остается плавающей) вы можете использовать в большинстве случаев $ id = $ this -> _ request-> getQuery ('id') + 0 ;

1 голос
/ 24 января 2009

Я всегда использовал больше phpish $this->_request->getPost('this') и $this->_request->getQuery('that') (это не так логично с getquery вместо getGet).

Что лучше из этих двух? (или если есть другой лучший способ)

Просто краткое объяснение выбора getQuery(). Выбор формулировки зависит от типа данных, а не от того, как они туда попали. GET и POST - это просто методы запроса, несущие всевозможную информацию, включая, в случае запроса POST, раздел, известный как «данные поста». Запрос GET не имеет такого блока, любые переменные данные, которые он несет, являются частью строки запроса URL (часть после?).

Итак, в то время как getPost() получает данные из раздела данных post запроса POST, getQuery() получает данные из строки запроса либо запроса GET, либо POST (а также других методов HTTP-запроса).

(Обратите внимание, что запросы GET не должны использоваться для чего-либо, что может привести к побочному эффекту, например, к изменению строки БД)

Итак, в ответ на ваш первый вопрос, используйте методы getPost() и getQuery(), таким образом, вы можете быть уверены, где находится источник данных (если вам все равно, getParams() также работает, но может включать дополнительные данные).

Какова лучшая практика для проверки ввода php с помощью этих методов?

Лучшее место для проверки ввода - это то, где вы первый используете его. То есть, когда вы вытягиваете его из getParams(), getPost() или getQuery(). Таким образом, ваши данные всегда верны там, где они вам нужны, и если вы их выдаете, вы знаете, что это безопасно. Имейте в виду, что если вы передадите его другому контроллеру (или действию контроллера), вам, вероятно, следует проверить его еще раз, чтобы быть в безопасности. То, как вы это сделаете, зависит от вашего приложения, но все еще требует проверки.

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