Rolf Bensch: Ajax: Problem mit Hochkomma " => \"

Beitrag lesen

Hi,

$SQL = "Update Tabelle SET $Feld = :Wert WHERE id = :id";
Hmmm. $Feld kommt aus "unsicherer Quelle". Im Original sitzt $Feld bereits in Backticks. Gemäß Doku müsste ich aber auch auf "ungültige Zeichen" und "reservierte Worte" prüfen. Macht das noch Sinn?

Das steht so nicht im MySQL-Handbuch. Vielmehr reicht es, Backticks zu verwenden und du kannst alle Zeichen und alle reservierten Wörter verwenden. Lediglich Backticks sind zu verdoppeln, damit sie nicht als Ende des Bezeichners aufgefasst werden.

ok, das hatte ich falsch interpretiert.

»»...

Ich sehe da jetzt kein wirkliches Problem - oder habe ich etwas übersehen?

Du hast gültige Syntax übersehen. Eine erfolgreiche Injection basiert darauf, dass der Ausnutzer gültige Syntax erzeugen kann. Hier reicht es, wenn im Wert für den Bezeichner ein Backtick unverdoppelt zu stehen kommt, denn dann hat man den Bezeichner verlassen und der Rest des Wertes wird als Code interpretiert. Ein Ausnutzer wird in eigenem Interesse für eine gültige Fortsetzung des Statements sorgen.

Da habe ich jetzt etwas recherchiert. Diese Backtick-Geschichte ist offensichtlich eine MySQL-Spezialität. Andere RDBMS setzen auf ANSI-Quotes. Die Frage ist daher, wie geht PDO mit den Backticks um? Das Manual schweigt sich darüber aus (jedenfalls habe ich nichts gefunden). An anderer Stelle las ich, dass PDO in Backticks gesetzte Identifier für andere RDBMS umsetzt, aber keine Silbe darüber, wie Backticks innerhalb der Identifier behandelt werden. Ich plane eigentlich keinen Einsatz anderer DB-Systeme,  man weiß aber nie was die Zukunft so bringt. Aktuell plane ich einfach alle Backticks aus $Feld zu löschen und den Rest PDO zu überlassen. Mit dieser Einschränkung kann ich gut leben und ich befinde mich auf der sicheren Seite.

Nochmals Danke für die Infos, sie haben meine Horizont deutlich erweitert.

Rolf