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