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