Как работает параметризация 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) заботится о правильном экранировании и проверке ввода, но это никогда нигде явно не указано. Это все, что параметризация в этом контексте? Для меня, когда мы говорим "параметризация»все это значит "подстановка строк ", вроде% -форматирования. Это неправильно?

Ответы на вопрос(5)

Ваш ответ на вопрос