Драйвер CodeIgniter PDO использует запрос вместо подготовки?Разве это не менее безопасно? - PullRequest
2 голосов
/ 19 марта 2012

Я новичок в среде CodeIgniter для php, и я искал драйвер базы данных PDO с версией 2.1.0. Я заметил, что он использует функцию запроса PDO, а не «prepare» и «bindParam» / «bindValue».

Разве это полностью не упускает смысла использования PDO и фактически делает его менее защищенным от SQL-инъекций, чем при использовании обычного драйвера mysql, который они предоставляют. Кажется, он не экранирует запросы, как это происходит с другими предоставленными драйверами? Или я что-то совершенно неверно истолковываю?

РЕДАКТИРОВАТЬ: похоже, что CodeIgniter может использовать PDO :: quote для очистки. Но даже в документации php говорится, что это не рекомендуется, так как она менее безопасна и, по-видимому, в первую очередь упускает из виду PDO

Ответы [ 5 ]

1 голос
/ 19 марта 2012

Я не знаю, КИ, но есть простое правило, которое нужно запомнить:

Несмотря на распространенное [странное] убеждение,

Бегство в одиночку ничего хорошего не дает.

Какна самом деле, это всегда должно быть экранирование + цитирование .
Если мы не процитируем экранированные данные, мы не получим никакой выгоды от экранирования.

Итак, я полагаю, что CI делает и то, и другое.Если это так - это должно быть безопасно.

Единственное, о чем я могу думать, это параметры LIMIT.Если вы передадите их как переменные строкового типа, запрос CI может выдать ошибку, как это делает PDO в режиме совместимости.Буду признателен, если вы протестируете это поведение и опубликуете результат.

1 голос
/ 19 марта 2012

Я смотрю на исходный код и вижу escape_str звонки quote и DB_driver->escape звонки escape_str. Я не совсем отследил общую структуру. Так что я точно не знаю, называется ли escape там, где и должно быть.

Тем не менее, PDO::quote безопасен, если используется правильно. Подготовленные операторы проще для прикладного программирования, но PDO::quote может быть лучшим выбором для библиотек, которые предоставляют свою собственную абстракцию.

1 голос
/ 19 марта 2012

Я не использовал CodeIgniter, поэтому мне пришлось немного изучить это.Как выясняется, CodeIgniter предлагает видимость параметризованных запросов, называемых Привязки запросов .

Работает так:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick')); 

Согласно документации:

Вторым преимуществом использования связываний является то, что значения автоматически экранируются, создавая более безопасные запросы.Вам не нужно помнить, чтобы вручную экранировать данные;двигатель делает это автоматически для вас.

Мне странно, что он абстрагирует функциональность подготовленных операторов.Я полагал, что это было в значительной степени сокращено и сухо.Хех: /

0 голосов
/ 19 марта 2012

Чтобы использовать pdo с оператором prepare, вам нужно внести небольшие изменения.

http://christopherickes.com/web-app-development/using-pdo-in-codeigniter/

тогда вы можете использовать подготовить заявление.

0 голосов
/ 19 марта 2012

Это действительно звучит правильно для меня.В документах для pdo :: query () говорится "данные внутри запроса должны быть должным образом экранированы ."Если вы перейдете по ссылке на pdo :: quote (), появится заметное предупреждение:

Если вы используете эту функцию для построения операторов SQL, вам настоятельно рекомендуется использовать PDO :: prepare ()подготовить операторы SQL со связанными параметрами вместо использования PDO :: quote () для интерполяции ввода пользователя в оператор SQL.Подготовленные операторы со связанными параметрами не только более переносимы, более удобны, невосприимчивы к SQL-инъекциям, но часто намного быстрее выполняются, чем интерполированные запросы, поскольку и на стороне сервера, и на стороне клиента могут кэшировать скомпилированную форму запроса.

Хотя я не могу понять, почему codeigniter использует query () вместо prepare ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...