Doctrine_Query 1.2.* уязвимость в методе update

от автора

Знаю, что уже есть Doctrine 2, но сейчас работаю с проектом на Doctrine 1.2.4 и думаю у многих есть проекты на этой версии ORM. Проблема существует при создании банальных запросов на update, вида:

  Doctrine_Query::create()                     ->update('Posts')                     ->set('Anons', $anons )                     ->where('id = ?', $id)                     ->execute();  


Идем в файлик Doctine/Query/Abstract.php и смотрим метод set:

    public function set($key, $value = null, $params = null)     {         if (is_array($key)) {             foreach ($key as $k => $v) {                 $this->set($k, '?', array($v));             }             return $this;         } else {             if ($params !== null) {                 if (is_array($params)) {                     $this->_params['set'] = array_merge($this->_params['set'], $params);                 } else {                     $this->_params['set'][] = $params;                 }             }              return $this->_addDqlQueryPart('set', $key . ' = ' . $value, true); //  Вот так просто, ни плейсхолдеров, ни экранирования          }     } 

Почему команда серьезных разработчиков написала такой непродуманный код непонятно.

Чем это грозит вам:
— если вы надеялись, что Doctrine сделает экранирование $value, то у вас уязвимость к SQL инъекции.
— если $value будет пустой, Doсtrine не подставит сама NULL и сгенерит не валидный запрос.

Почему нельзя было сделать также как в where?

  Doctrine_Query::create()                     ->update('Posts')                     ->set('Anons = ?', $anons )                     ->where('id = ?', $id)                     ->execute();  

ссылка на оригинал статьи http://habrahabr.ru/post/169781/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *