...

суббота, 3 мая 2014 г.

Устраняем ошибки при получении от пользователя массива вместо строки


сегодня в 11:38


Недавно я заметил, что на многих сайтах сделанных на Yii Framework есть одна и та же ошибка:

Если в каком нибудь поле ввода в атрибуте name добавить квадратные скобки и отправить форму, то можно получить сообщение об ошибке, типа:

htmlspecialchars() expects parameter 1 to be string, array given

Иногда даже можно увидеть исходный код PHP файлов, если разработчик забыл убрать константу YII_DEBUG.

Эта ошибка присутствует и на крупных проектах и даже на самом http://ift.tt/1fDpkaq



Происходит она из за того, что стандартные правила валидации генерируемые Gii предохраняют только от попытки записи некорректных данных в БД. При выводе пользовательских данных на станицу обычно используется CHtml::encode() но она передает переменную напрямую в PHP функцию htmlspecialchars() и не проверяет её тип.


Одним из способов решения данной проблемы является написание небольшого behavior:



class FilterArraysBehavior extends CModelBehavior
{
public function filterArrays($value)
{
is_array($value) && $value = null;
return $value;
}

public function beforeValidate($event)
{
$validator = new CFilterValidator();
$validator->attributes = array_keys($this->owner->attributes);
$validator->filter = array($this, 'filterArrays');
$this->owner->validatorList->add($validator);
}
}




Этот behavior добавляет фильтрующее правило валидации для всех атрибутов модели.

Его можно подключить сразу ко всем моделям, если изменить их общих предков:

protected/components/Model.php

и

protected/components/FormModel.php

добавив следующий код:

public function init()
{
$this->attachBehavior('FilterArraysBehavior', 'behaviors.FilterArraysBehavior');
}




После этого передаваемые пользователем массивы, на выводе будут преобразовываться в пустые строки.


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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий