- PVSM.RU - https://www.pvsm.ru -

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

Недавно я заметил, что на многих сайтах сделанных на Yii Framework есть одна и та же ошибка:
Если в каком нибудь поле ввода в атрибуте name добавить квадратные скобки и отправить форму, то можно получить сообщение об ошибке, типа:
htmlspecialchars() expects parameter 1 to be string, array given
Иногда даже можно увидеть исходный код PHP файлов, если разработчик забыл убрать константу YII_DEBUG.

Эта ошибка присутствует и на крупных проектах и даже на самом yiiframework.com/search/?q%5b%5d= [1]

Происходит она из за того, что стандартные правила валидации генерируемые 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');
}

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

Автор: Lexxtor

Источник [2]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/yii/59523

Ссылки в тексте:

[1] yiiframework.com/search/?q%5b%5d=: http://www.yiiframework.com/search/?q[]=k

[2] Источник: http://habrahabr.ru/post/221655/