Почему нет явной валидации для string в CTypeValidator?

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
aleksp
Сообщения: 12
Зарегистрирован: 2011.07.26, 12:38

Почему нет явной валидации для string в CTypeValidator?

Сообщение aleksp »

В итоге имеем, к примеру есть такой код:

Код: Выделить всё

public function rules()
    {
        return array(
            array('username, password, verifyCode', 'required'),
            array('username, password, verifyCode', 'type', 'type' => 'string'),
            array('username, password, verifyCode', 'length', 'max' => 255),
            array('rememberMe', 'boolean'),
            array('verifyCode', 'captcha', 'allowEmpty' => !Yii::app()->user->isGuest),
        );
    }
 
Злоумышленник для одного из атрибутов 'username, password, verifyCode' через POST преднамеренно передает массив. Валидация 'type', 'type' => 'string' успешно проходит(!) из-за отсутствия явной валидации для string в CTypeValidator:

Код: Выделить всё

    /**
     * Validates the attribute of the object.
     * If there is any error, the error message is added to the object.
     * @param CModel $object the object being validated
     * @param string $attribute the attribute being validated
     */
    protected function validateAttribute($object,$attribute)
    {
        $value=$object->$attribute;
        if($this->allowEmpty && $this->isEmpty($value))
            return;

        if($this->type==='integer')
            $valid=preg_match('/^[-+]?[0-9]+$/',trim($value));
        else if($this->type==='float')
            $valid=preg_match('/^[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value));
        else if($this->type==='date')
            $valid=CDateTimeParser::parse($value,$this->dateFormat,array('month'=>1,'day'=>1,'hour'=>0,'minute'=>0,'second'=>0))!==false;
        else if($this->type==='time')
            $valid=CDateTimeParser::parse($value,$this->timeFormat)!==false;
        else if($this->type==='datetime')
            $valid=CDateTimeParser::parse($value,$this->datetimeFormat, array('month'=>1,'day'=>1,'hour'=>0,'minute'=>0,'second'=>0))!==false;
        else if($this->type==='array')
            $valid=is_array($value);
        else
            return;

        if(!$valid)
        {
            $message=$this->message!==null?$this->message : Yii::t('yii','{attribute} must be {type}.');
            $this->addError($object,$attribute,$message,array('{type}'=>$this->type));
        }
    }
 
Что в дальнейшем вызывает исключение в валидаторе длины 'length', 'max' => 255:
2012/02/24 22:47:01 [error] [php] mb_strlen() expects parameter 1 to be string, array given (/usr/home/admin/sites/*****.com/yii-1.1.10.r3566/framework/validators/CStringValidator.php:85)

Глупейшее недопущение по-моему. :?
aleksp
Сообщения: 12
Зарегистрирован: 2011.07.26, 12:38

Re: Почему нет явной валидации для string в CTypeValidator?

Сообщение aleksp »

Решение. Дописать проверку для string:

Код: Выделить всё

    protected function validateAttribute($object,$attribute)
    {
        $value=$object->$attribute;
        if($this->allowEmpty && $this->isEmpty($value))
            return;

        if($this->type==='string')     // Добавлена явная валидация
            $valid=is_string($value);  // для строкового типа!
        else if($this->type==='integer')
            $valid=preg_match('/^[-+]?[0-9]+$/',trim($value));
        else if($this->type==='float')
            $valid=preg_match('/^[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value));
        else if($this->type==='date')
            $valid=CDateTimeParser::parse($value,$this->dateFormat,array('month'=>1,'day'=>1,'hour'=>0,'minute'=>0,'second'=>0))!==false;
        else if($this->type==='time')
            $valid=CDateTimeParser::parse($value,$this->timeFormat)!==false;
        else if($this->type==='datetime')
            $valid=CDateTimeParser::parse($value,$this->datetimeFormat, array('month'=>1,'day'=>1,'hour'=>0,'minute'=>0,'second'=>0))!==false;
        else if($this->type==='array')
            $valid=is_array($value);
        else
            return;

        if(!$valid)
        {
            $message=$this->message!==null?$this->message : Yii::t('yii','{attribute} must be {type}.');
            $this->addError($object,$attribute,$message,array('{type}'=>$this->type));
        }
    }
 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Почему нет явной валидации для string в CTypeValidator?

Сообщение samdark »

Выглядит логично. Сможете на английском закинуть то же в трекер гитхаб, чтобы посмотрели остальные члены команды?
Ответить