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

сегодня в 11:38

Недавно я заметил, что на многих сайтах сделанных на Yii Framework есть одна и та же ошибка: Если в каком нибудь поле ввода в атрибуте 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'); } После этого передаваемые пользователем массивы, на выводе будут преобразовываться в пустые строки.

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

© Habrahabr.ru