Missing argument 2 for wpdb::prepare()
Die neue WordPress Version 3.5 ist erschienen und in einigen Themes und Plugins wird nach einem Update sicherlich die Warnung Missing argument 2 for wpdb::prepare() erscheinen. Dies ist unter anderem eine neue Meldung, die in der neuen Version vorhanden ist. Man muss noch erwähnen, dass man beruhigt sein. Das jeweilige WordPress Theme bzw. Plugin muss nicht unbedingt fehlerhaft sein. Die Warnung soll helfen die Sicherheitslücken in Themes und Plugins zu finden.
Wenn die Warnung an einer Stelle auftritt, dann sollte man jedoch trotzdem ein Auge darauf werfen und die Fehlerstelle beheben, weil es durchaus sein kann, dass die betroffene Stelle eine Lücke für eine SQL-Injection (dt. SQL-Einschleusung) birgt.
Die Funktion $wpdb->prepare() funktioniert nämlich folgendermaßen:
1 |
$wpdb->prepare("SELECT * FROM tabelle WHERE id = %d AND name = %s", $id, $name); |
Man arbeitet mit Platzhaltern und sichert so den Query ab. Im oberen Beispiel ist der Platzhalter %d für den zweiten Parameter id bestimmt, welcher eine Zahl (Integer) ist. Der dritte Parameter name – ein String – wird mit Hilfe des Platzhalter %s in den Query platziert.
Wenn kein Parameter an das Query übergeben wird, dann kann der Query ohne Vorschalten der prepare-Funktion aufgerufen werden. Da wo keine Variablen an die Abfrage dynamisch übergeben werden, tut die prepare-Funktion im Grunde gesehen nichts. Man kann in diesen Fällen auf sie verzichten, wie zum Beispiel in folgenden Fällen:
1 |
$wpdb->prepare("SELECT * FROM tabelle"); |
1 |
$wpdb->prepare("SELECT * FROM tabelle WHERE id = 234"); |
Im ersten Fall werden alle Einträge abgefragt, im zweiten Fall ein bestimmter. Die id in der zweiten Abfrage ist jedoch fest eingebaut und wechselt nicht. Bei diesen Abfragen ist die Vorschaltung von prepare nicht notwendig und die Funktion wird auch nichts machen, liefert aber trotzdem eine Warnung.
Die eigentliche Lücke liegt dann in solchen Abfragen:
1 |
$wpdb->prepare("SELECT * FROM tabelle WHERE id = $id"); |
Die obere Abfrage ist nicht sicher. Es sieht so aus, als würde prepare den Query absichern, doch weit gefehlt. Die Variable id wird direkt in das Query unaufbereitet platziert. Für solche Fälle ist die Warnung dann interessant. Korrekt und absichert sieht die Abfrage dann folgendermaßen aus:
1 |
$wpdb->prepare("SELECT * FROM tabelle WHERE id = %d", $id); |
Die letzten Kommentare