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

в 8:59, , рубрики: doctrine, php, метки: ,

Знаю, что уже есть 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(); 

Автор: bardex

Источник

Поделиться

* - обязательные к заполнению поля