Безопасность вводимых данных

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
PinCode
Сообщения: 21
Зарегистрирован: 2013.04.12, 00:50

Безопасность вводимых данных

Сообщение PinCode »

Всем привет!

Столкнулся с проблемой, что пользователь при регистрации может ввести в поле html код и он отобразится.

Можно защититься, выводя данные в CHtml::encode();
Но беда в том, что в БД уже будет находиться вредоносный код.

Как элегантно сделать фильтрацию вводимых пользователем данных при массовом присваивании?
Аватара пользователя
PinCode
Сообщения: 21
Зарегистрирован: 2013.04.12, 00:50

Re: Безопасность вводимых данных

Сообщение PinCode »

Угу, спасибо. А как бы красиво сделать фильтрацию для всех входящих данных, не перечисляя их в rules?
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Безопасность вводимых данных

Сообщение Nafania »

В beforeSave можно сделать.
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Безопасность вводимых данных

Сообщение vova07 »

Я обычно делаю очистку входных данных от ненужного муссовра, в поведении (behavior), в которой СHtmlPurifier очищает все свойства которые я ему передаю.
Это удобно если ХТМЛ код вводится для нескольких моделей, и не нужно писать всегда повторно тот же код.
Аватара пользователя
PinCode
Сообщения: 21
Зарегистрирован: 2013.04.12, 00:50

Re: Безопасность вводимых данных

Сообщение PinCode »

vova07 писал(а):Я обычно делаю очистку входных данных от ненужного муссовра, в поведении (behavior), в которой СHtmlPurifier очищает все свойства которые я ему передаю.
Это удобно если ХТМЛ код вводится для нескольких моделей, и не нужно писать всегда повторно тот же код.
Поделитесь кодом, пожалуйста
Аватара пользователя
PinCode
Сообщения: 21
Зарегистрирован: 2013.04.12, 00:50

Re: Безопасность вводимых данных

Сообщение PinCode »

Сделал на примере из вики:

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

<?php
class CSafeContentBehavior extends CActiveRecordBehavior
{
    public $attributes =array();
    public $allAttributes = true;
    protected $purifier;
 
    function __construct(){
        $this->purifier = new CHtmlPurifier;
    }
 
    public function beforeSave($event)
    {
        if($this->allAttributes) {
            foreach ($this->getOwner()->getAttributes() as $attribute => $value) {
                $this->getOwner()->{$attribute} = CHtml::encode($this->purifier->purify($this->getOwner()->{$attribute}));
            }
        } else {
            foreach($this->attributes as $attribute) {
            $this->getOwner()->{$attribute} = CHtml::encode($this->purifier->purify($this->getOwner()->{$attribute}));
        }
        } 
    }
} 
И в модель добавляем:

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

public function behaviors()
    {
        return array(
        'CSafeContentBehavor' => array( 
            'class' => 'application.behaviors.CSafeContentBehavior',
            'allAttributes' => true,
        ),
    );
    } 
Ответить