wpdb-> insert: muss ich mich gegen SQL Injection vorbereiten?

14

Muss ich wpdb vorbereiten bevor wpdb-> einfügen?

Wenn ich mit wpdb-> insert Werte in eine WordPress-Tabelle einfüge, muss ich meine Daten vor dem Einfügen "bereinigen" oder erledigt diese Methode (wpdb-> insert) dies für mich?

Rotkonservatorium
quelle

Antworten:

21

Nein, Sie sollten die Daten nicht vorbereiten oder entkommen, dies wird von der wpdbKlasse für Sie erledigt .

Aus der wpdb-Klassenreferenz :

Daten :

(Array) Daten, die eingefügt werden sollen (in Spalte => Wertepaare). Sowohl $ data-Spalten als auch $ data-Werte sollten "raw" sein (SQL-Escape-Zeichen dürfen nicht verwendet werden).

Wenn Sie jedoch Ihr eigenes SQL geschrieben haben, anstatt die insertMethode zu verwenden, sollten Sie es vermeiden, die Methode zu verwenden prepare.

niemand
quelle
8
So fügen Sie eine Notiz hinzu: Beide insert& updatebrauchen das nicht. Aber es sollte mit verwendet werden query.
Kaiser
1

Das Folgende ist eine Warnung für die wpdb-Klasse.

https://codex.wordpress.org/Class_Reference/wpdb

Eine Warnung

Einige Funktionen in dieser Klasse verwenden eine SQL-Anweisung als Eingabe. Sie müssen SQL-Escapezeichen für alle nicht vertrauenswürdigen Werte setzen, die Sie in die SQL-Abfrage einbeziehen, um SQL-Injection-Angriffe zu verhindern. Überprüfen Sie die Dokumentation, um festzustellen, ob die von Ihnen geplante Funktion SQL entgeht oder erwartet, dass sie vor dem Escape-Vorgang ausgeführt wird.

Deshalb lese ich das so: Die wpdb-Klasse bereitet die Daten nicht automatisch für Sie vor oder entgeht ihnen.

Ich bin mir ziemlich sicher, dass ich die Verwendung der prepare-Klasse (?) Vorschlage, wenn Sie der Datenquelle in Ihrem Code nicht 100% vertrauen können.

Denken Sie nicht, dass die Verwendung der Vorbereitungsklasse das Problem beheben kann, ohne die Vorbereitungsklasse ordnungsgemäß zu verwenden. Ich bin ziemlich neu in diesem Bereich, bitte poste alle Korrekturen als Antwort, wenn ich nicht richtig bin.

$ wpdb-> prepare ("SELECT * FROM Tabelle WHERE ID =% d AND Name =% s", $ id, $ name);

In der obigen Anweisung gibt es zwei zusätzliche Attribute. Eine für die ID und eine für den Namen. Soweit ich es lese, entspricht jedes der Anzahl der Elemente in Ihrer Abfrage. Auch% s = string,% d = integer und% f = float.

Wenn Sie nach meiner Lektüre die zusätzlichen Attribute nicht eingeben, wird prepare eigentlich nichts bewirken. Es wird eine Warnung angezeigt, aber wenn Sie diese deaktivieren, wissen Sie es möglicherweise nicht.

Hier ist ein Beispiel aus der Klassenreferenz selbst, in der eine Vorbereitungsklasse zu einem INSERT hinzugefügt wird.

https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

$ wpdb-> query ($ wpdb-> prepare ("EINFÜGEN IN $ wpdb-> postmeta (post_id, meta_key, meta_value) VALUES (% d,% s,% s)", array (10, $ metakey, $ metavalue) ));

Ich mache mir Sorgen, dass die überstimmte Antwort auf derselben Seite, auf die sich "niemand" bezieht, falsch ist. Ich gehe davon aus, dass Sie prepare () verwenden, aber keine anderen standardmäßigen PHP-Fluchtmethoden, da ich diese Antwort ebenfalls als richtig angesehen habe ... bis ich tiefer gegraben habe.

Wie auch immer ... vielleicht haben sich die Dinge seit der ursprünglichen Antwort geändert.

Felixius
quelle
Hmmm, das klingt eher nach einer Frage als nach einer Antwort
Mark Kaplun
Akzeptierte Antwort ist korrekt. Wenn Sie Funktionen wie $wpdb->insert()$ wpdb-> update () `oder $wpdb->delete()data verwenden, sollte dies RAW sein. In einer Situation, in der Sie zB eine $wpdb->query()SQL-Anweisung als Eingabe verwenden und übergeben, sollten Sie nicht vertrauenswürdige Daten umgehen.
NMR
nmr, ich glaube ich verstehe jetzt. Um dies zu verdeutlichen, haben Sie als Beispiel die Einfügemethode und die Löschmethode verwendet, im Gegensatz zu den Beispielen, die ich für die Verwendung der Abfragemethode verwendet habe ... (% wpdb -> abfragen). Lösche ich meine Antwort? Oder lass es?
Felixius