Недавно я заметил, что на многих сайтах сделанных на Yii Framework есть одна и та же ошибка:
Если в каком нибудь поле ввода в атрибуте name добавить квадратные скобки и отправить форму, то можно получить сообщение об ошибке, типа:
Иногда даже можно увидеть исходный код PHP файлов, если разработчик забыл убрать константу YII_DEBUG.
Эта ошибка присутствует и на крупных проектах и даже на самом yiiframework.com/search/?q%5b%5d=
Происходит она из за того, что стандартные правила валидации генерируемые Gii предохраняют только от попытки записи некорректных данных в БД. При выводе пользовательских данных на станицу обычно используется
Одним из способов решения данной проблемы является написание небольшого behavior:
Этот behavior добавляет фильтрующее правило валидации для всех атрибутов модели.
Его можно подключить сразу ко всем моделям, если изменить их общих предков:
и
добавив следующий код:
После этого передаваемые пользователем массивы, на выводе будут преобразовываться в пустые строки.
Если в каком нибудь поле ввода в атрибуте name добавить квадратные скобки и отправить форму, то можно получить сообщение об ошибке, типа:
htmlspecialchars() expects parameter 1 to be string, array givenИногда даже можно увидеть исходный код PHP файлов, если разработчик забыл убрать константу YII_DEBUG.
Эта ошибка присутствует и на крупных проектах и даже на самом yiiframework.com/search/?q%5b%5d=
Происходит она из за того, что стандартные правила валидации генерируемые 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'); }
После этого передаваемые пользователем массивы, на выводе будут преобразовываться в пустые строки.
