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?
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?
Antworten:
Nein, Sie sollten die Daten nicht vorbereiten oder entkommen, dies wird von der wpdb
Klasse 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 insert
Methode zu verwenden, sollten Sie es vermeiden, die Methode zu verwenden prepare
.
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.
$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.
Nein, Sie müssen nicht vor SQL-Injections schützen, wenn Sie wpdb insert oder wpdb delete verwenden.
Siehe die folgenden Links:
https://codex.wordpress.org/Data_Validation#Database
https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks
insert
&update
brauchen das nicht. Aber es sollte mit verwendet werdenquery
.