Wie funktioniert die Parametrisierung von SQL-Abfragen?
Ich fühle mich ein wenig albern, wenn ich das frage, da ich die einzige Person auf der Welt zu sein scheine, die es nicht versteht, aber hier ist es trotzdem. Ich werde Python als Beispiel verwenden. Wenn ich rohe SQL-Abfragen verwende (normalerweise verwende ich ORMs), verwende ich die Parametrisierung, wie im folgenden Beispiel mit SQLite:
Methode A:
username = "wayne"
query_params = (username)
cursor.execute("SELECT * FROM mytable WHERE user=?", query_params)
Ich weiß, dass dies funktioniert und ich weiß, dass dies der allgemein empfohlene Weg ist, dies zu tun. Eine SQL-Injection-gefährdete Möglichkeit, dasselbe zu tun, wäre etwa wie folgt:
Methode B:
username = "wayne"
cursor.execute("SELECT * FROM mytable WHERE user='%s'" % username)
Soweit ich das beurteilen kann, verstehe ich SQL Injection, wie in erklärtdieser Wikipedia-Artikel. Meine Frage ist einfach: Wie unterscheidet sich Methode A wirklich von Methode B? Warum stimmt das Endergebnis von Methode A nicht mit Methode B überein? Ich gehe davon aus, dass diecursor.execute()
Die Methode (Teil der DB-API-Spezifikation von Python) kümmert sich um die korrekte Eskapierung und Typüberprüfung der Eingabe, wird jedoch nirgendwo explizit angegeben. Ist das alles, was Parametrisierung in diesem Zusammenhang ist? Wenn wir "Parametrisierung" sagen, bedeutet das für mich nur "Stringsubstitution", wie% -Formatierung. Ist das falsch