Обработка ввода с помощью Zend Framework (Post, get и т. Д.)

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

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

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

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

Благодаря!

Обычно я использую $ 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); 

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

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

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

Например:

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

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

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

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

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

 $dataGet = $this->getRequest()->getParam('id',null); $valid = new Zend_Validate_Digits(); if( isset($dataGet) && $valid->isValid($dataGet) ){ // do some... } else{ // not set } 

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

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

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

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

(Обратите внимание, что GET Requests не должны использоваться ни для чего, что может вызвать побочный эффект, например, для изменения строки DB)

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

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

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

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