Как работает параметризация SQL-запроса?
Я чувствую себя немного глупо, когда спрашиваю об этом, потому что я, кажется, единственный человек в мире, который нене понимаю, но все равно идет. Я'Я собираюсь использовать Python в качестве примера. Когда я использую необработанные запросы SQL (я обычно использую ORM), я использую параметризацию, как в этом примере с использованием SQLite:
Метод А:
username = "wayne"
query_params = (username)
cursor.execute("SELECT * FROM mytable WHERE user=?", query_params)
Я знаю, что это работает, и я знаю, что это обычно рекомендуемый способ сделать это. SQL-уязвимый способ сделать то же самое будет выглядеть примерно так:
Метод Б:
username = "wayne"
cursor.execute("SELECT * FROM mytable WHERE user='%s'" % username)
Насколько я могу сказать, я понимаю SQL-инъекцию, как объяснено вэта статья в Википедии, Мой вопрос прост: чем метод А действительно отличается от метода Б? Почему конечный результат метода A не совпадает с методом B? Я предполагаю, чтоcursor.execute()
метод (часть Python 'Спецификация DB-API) заботится о правильном экранировании и проверке ввода, но это никогда нигде явно не указано. Это все, что параметризация в этом контексте? Для меня, когда мы говорим "параметризация»все это значит "подстановка строк ", вроде% -форматирования. Это неправильно?