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

StackOverflow https://stackoverflow.com/questions/458299

Вопрос

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

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

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

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

Спасибо!

Это было полезно?

Решение

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

Используя Zend_Filter_Input, вы можете выполнить проверку на уровне приложения, используя средства проверки Zend (или вы также можете написать свои собственные).Например, вы можете убедиться, что поле "месяцы" является числом:

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

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

$input = new Zend_Filter_Input($filters, $validators, $data);

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

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

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

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

Например.:

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

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

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

Вам нужно будет написать код проверки в том месте, где он вам нужен.Вы, конечно, можете написать несколько вспомогательных методов, но вы не можете ожидать, что 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, раздел, известный как "данные post".Запрос GET не имеет такого блока, любые переменные данные, которые он несет, являются частью строки запроса URL (часть после ?).

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top