Знаю, что уже есть 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/
Добавить комментарий