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