sql-инъекции в AR

Есть код:


	public function rules()

	{

		return array(

			...

			array('album_id', 'numerical', 'integerOnly'=>true),

			array('album_id', 'exist'),

			...

		);

	}

Тут очевидно, что получаем возможность sql-инъекции через валидатор exist несмотря на …‘numerical’, ‘integerOnly’=>true…

Есть ли какой-нибудь простой способ этого избежать или самому всегда в контроллере писать mysql_real_escape_string() для каждого атрибута?

хм, а каким образом там идет SQL-иъекция?

дело все в том, что в Yii об этом уже позаботились :)

и все запросы готовятся через PDO, а его использование исключает возможность простой инъекции. Да, есть какие-то варианы через китайские символы хакнуть, но это экзотика :)

Да, все верно, теперь понял. Ошибка закралась в самописный валидатор.[color="#808080"] Там ковычки в запрос попадали через критерий[/color]

Малость затупил. :wacko:

Другой вопрос, допустим есть таблица с альбомами фотографий

id

gall_id - галерея

albumname - имя альбома

мне надо исключить возможность одинаковых имен альбомов в одной галерее

первое что приходит на ум:


			array('albumname', 'unique',

				'criteria'=>array(

					'condition'=>'gall_id = :gall_id',

					'params'=>array(':gall_id'=>$this->gall_id)

				),

Но это не работает, хотя указан дополнительный критерий запроса. В результате вообще никакой валидации не происходит, можно добавлять записи с одинаковым albumname и gall_id

напиши свою функцию валидации, в которой просто каунтом по базе с нужными параметрами gall_id и albumname выбери все с текущими значениями. если больше нуля, то вызов ошибки.

да, уже сделал так, некуда деваться. Но все ж интересно как использовать criteria для unique.

[quote name="CUniqueValidator"]criteria property (available since v1.0.8 )

public array $criteria;

additional query criteria. This will be combined with the condition that checks if the attribute value exists in the corresponding table column. This array will be used to instantiate a CDbCriteria object.
[/quote]

Это тоже самое по сути должно быть

Проблема найдена. Список валидаторов из rules модель получает при ее создании, а не при вызове validate().

В этот момент все атрибуты пусты