Задать вопрос

Защищает ли PDO от SQL-инъекции?

Доброго дня.

Подскажите пожалуйста, полностью ли защищает PDO от SQL инъекций? И есть ли какие-либо сложные инъекции, которые все-таки можно сделать? Все запросы делаются в Yii с помощью querybuildera и прочих инструментов фреймворка. Помимо sql инъекций есть еще какие-либо актуальные техники взлома БД?
  • Вопрос задан
  • 12756 просмотров
Подписаться 11 Оценить Комментировать
Решения вопроса 2
svd71
@svd71
Защищенность PDO от инъекций строится на использованании не динамически создаваемых запросов, но запросов с параметрами. Любой момент изменения запроса в коде под какие-то (часто необдуманные) нужды приводит к возможности инъекции.

пример вам уже привели, повторю его:
$qry = 'select * from users where user_id='".$usrname.'" and passwd='".md5($passwd.'$salt).'"';


запрос подвержет инъекции: достаточно подсунуть имя с двойной кавычкой и далее через точкузапятую свой запрос. Остаток с паролем комментируется символами:

$usrname = '"; update users set passwd="12345" where id="admin"; -- ';

приведет фактически к такому запросу
select * from users where id=""; update users set passwd="12345" where id="admin"; -- passwd=''


совсем другое дело PDO. Он не допускает мультикомандные запросу как факт (то есть после первого select обработка не пойдет). А во вторых указанные инъекции просто запицется в параметры запроса, что будет обработанно корректно.
Ответ написан
@ruslite
Когда данные обработаны в PDO, они напрямую передаются драйверу базы данных, либо запрос строиться безопасным образом внутри данного расширения. Как можно заметить, это простой путь решения проблемы с SQL инъекциями.
Однако при использовании предопределенных выражений совместно с PDO необходимо знать некоторые нюансы, чтобы избежать неприятных ситуаций. Например, в MySQL клиенте некоторые запросы, составленные посредством предопределенных выражений, не могут быть выполнены, а так же они не используют кэш, что может замедлить работу вашего web-приложения.
Гарантированная безопасность при использовании предопределенных выражений звучит успокаивающе, но разработчики не должны принимать PDO и другие слои абстракции\предопределенные выражения за абсолютную защиту от взлома. Любые входящие данные должны проверяться, PDO – дополнительная линия обороны. Это расширение не закрывает все множество уязвимостей, посредством которых может быть нанесен вред вашей информации, но в то же время, PDO неплохо справляется с вопросом предотвращения SQL инъекций.

Источник
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
charon
@charon
не полностью. Если, допустим, имена таблиц берутся из введённых пользователем данных, то там нельзя использовать подстановки. В этом случае вариантом решения может быть проверка пользовательского ввода на вхождение в допустимое множество (у вас же не бесконечное количество таблиц?)
Ответ написан
Комментировать
metamorph
@metamorph
С помощью querybuilder можно построить запрос, подверженый инъекциям.
К примеру, ->where('id=' . $id).

А как Вам такая техника взлома БД: закачать и выполнить на сервере php-файл?

Короче, недостаточно данных для ответа :)
Ответ написан
@gro
С какой стати PDO должно от чего-то защищать?
Если вы про prepared statement то, они да, могут помочь, если использовать их с умом и понимать, что делаешь. Но у меня сомнения, что вы понимаете. При чём тут пароли и md5?
Ответ написан
Комментировать
@MiNiMoZg Автор вопроса
Спасибо. Есть ли еще варианты? Просто нужно как то аргументировать подрядчику что PDО не полностью защитит базу, поэтому не стоит шифровать пароли функцией md5(). Помогите пожалуйста с аргументами. Буду очень признателен.
Ответ написан
@MiNiMoZg Автор вопроса
Скажем так что я очень негодовал когда увидел md5(password) попросил исправить хеширование паролей на что то более пригодное. Мне аргументировали что их базу не скачают со стороны клиента а защита сервера не их задача и поэтому пароли можно сильно не хешировать. Возможно вы правы и я где то ошибся с определениями. Про связывание переменных в Mysql кое что знаю. Прошу не грубить. Я прошу помощи а не критики =)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы