Ich möchte sicherstellen, dass alle Daten in meinen Plugins / Themes sicher behandelt werden, bevor ich in die Datenbank gehe und sie an den Browser ausgebe. Mein Problem ist, dass es Situationen gibt, in denen die API die Bereinigung für Sie übernimmt - wie beim Speichern von Post-Meta-Feldern - und andere, in denen der Autor des Plugins / Themes voll verantwortlich dafür ist - wie beim Speichern von benutzerdefinierten Einstellungen.
Im Rahmen dieser Frage geht es mir nicht darum, Daten auf Domain-Ebene zu validieren - z. B. zu überprüfen, ob ein Altersfeld in einem Formular zwischen 0 und 120 liegt oder ob eine E-Mail-Adresse gültig ist. Ich mache mir nur Sorgen um die Sicherheit - z. B. um das Auslassen von SQL-Abfragen, um das Einfügen von SQL-Inhalten beim Speichern in die Datenbank zu vermeiden, oder um Daten zu bereinigen, die in HTML-Vorlagen ausgegeben werden, um XSS zu vermeiden.
Ich weiß, dass Sie für die Ausgabe-Bereinigung immer Funktionen wie esc_html()
und verwenden müssen, esc_attr()
wenn Sie Variablen in HTML-Vorlagen zurückgeben. Aber was ist mit der Verwendung von Vorlagen-Tags ? Sterilisieren sie alle die Ausgabe bereits? Wenn ja, für welchen Kontext (allgemeines HTML, Tag-Attribute usw.)? Einige Funktionen haben Varianten für verschiedene Kontexte (wie the_title_attribute()
, aber die meisten nicht.
Ich weiß, dass ich für die Bereinigung von Eingaben $wpdb->prepare()
manuelle Abfragen verwenden muss, aber was ist, wenn ich die Einstellungs-API zum Erstellen einer Plugin-Einstellungsseite oder zum Speichern von Post-Metafeldern für einen benutzerdefinierten Post-Typ verwende?
Im Moment habe ich mich jedes Mal, wenn ich eine Funktion verwende, durch Core gekümmert und Tutorials gelesen, um herauszufinden, ob sie bereinigt oder nicht, aber das ist fehleranfällig und zeitaufwändig. Ich hoffe, eine umfassende Liste aller möglichen Situationen zu finden und zu erfahren, ob die API damit fertig wird oder nicht. z.B,
API validiert / desinfiziert
- Post-Meta speichern mit
update_postmeta()
- Benutzermeta speichern mit
update_user_meta()
- Beitragstitel ausgeben - Verwenden Sie die kontextabhängige Variante von
the_title()
- etc
Sie müssen manuell validieren / desinfizieren
- Plugin-Optionen mit der Einstellungs-API speichern. Übergeben Sie einen Rückruf als 3. Parameter von
register_setting()
. - Direkte Datenbankabfragen: Wickeln Sie die Abfrage in
$wpdb->prepare()
. - Variablen in HTML ausgeben. Verwendung
esc_attr()
,esc_html()
usw. - etc
Mich würde auch interessieren, warum die API sie in bestimmten Situationen bereitstellt, in anderen jedoch nicht. Ich gehe davon aus, dass es etwas mit der unbekannten Natur der Daten zu tun hat, würde aber gerne eine gründliche Erklärung hören.
the_title()
,the_permalink()
etc) Sie sind gut , aber mit benutzerdefinierten Daten , die Sie nicht (zBget_post_meta()
). Wenn Sie Zweifel haben, reinigen Sie sich selbst - es kann nicht schaden.Antworten:
Hier gibt es zwei Konzepte:
Die Validierung liegt fast ausschließlich bei Ihnen . Sie wissen, welche Daten Sie von einem Benutzer verlangen, und Sie wissen, welche Daten Sie erwarten - WordPress nicht. Die Validierung wird beispielsweise für den
save_post
Hook ausgeführt, bevor er in der Datenbank gespeichertupdate_post_meta
wird. Sie kann auch durch Angabe einer Rückruffunktion in der Einstellungs-API erfolgen, die aufgerufen wird, bevor WordPress die Daten speichert.Desinfektion ist etwas uneinheitlicher. Wenn Sie mit Daten arbeiten, die WordPress von Haus aus kennt (z. B. die Kachel eines Posts), können Sie sicher sein, dass WordPress die Daten bereits sicher gemacht hat. "Sicher" hängt jedoch vom Kontext ab. Was für die Verwendung auf einer Seite sicher ist, ist als Elementattribut nicht unbedingt sicher. Daher wird Wordpress hat unterschiedliche Funktionen für unterschiedlichen Kontext (zB
the_title()
,the_title_rss()
,the_title_attribute()
) - so dass Sie die richtigen verwenden müssen .In Ihrem Plug-In werden möglicherweise hauptsächlich Post-Meta-Daten oder Ereignisdaten aus einer benutzerdefinierten Tabelle verarbeitet. WordPress weiß nicht, worum es sich bei diesen Daten handelt oder wofür sie bestimmt sind. Daher weiß es nicht, wie es sicher gemacht werden soll. Das liegt ganz bei Ihnen . Dies ist besonders wichtig bei der Verwendung
esc_url()
,esc_attr()
,esc_textarea()
etc vor bösartigen Eingang zu verhindern , dass Code einbetten zu können. Da WordPress weiß,next_posts()
dass eine URL auf der Seite gedruckt werden soll, gilt diesesc_url()
- aber mit Post-Meta, zum Beispiel, es weiß nicht, dass eine URL gespeichert wird - oder was Sie damit tun möchten (wenn Sie druckenesc_url()
, wenn Sie umleiten)esc_url_raw()
. Wenn Sie auf der Hut sind und sich selbst davonmachen, tun Sie dies so spät wie möglich.Zum Schluss - was ist mit dem Speichern von Daten? Müssen Sie es dann sicher machen? Wie bereits erwähnt Sie tun müssen , dass Daten machen gilt. Aber wenn mit Wordpress API (
wp_insert_post()
,update_post_meta()
etc) , dann brauchen Sie die Daten nicht zu sanieren - weil beim Speichern von Daten des einzigen desinfizierende Sie müssen tun werden soll SQL - Anweisungen entkommen - und Wordpress tut dies. Wenn Sie direkte SQL-Anweisungen ausführen (z. B. zum Lesen / Schreiben von Daten aus einer benutzerdefinierten Tabelle), sollten Sie die$wpdb
Klasse verwenden, um Ihre Abfragen zu bereinigen.Ich habe diesen Blog-Beitrag über die Datenbereinigung und -validierung geschrieben, der Ihnen möglicherweise hilfreich ist. Darin spreche ich darüber, was in dieser Hinsicht von Ihnen erwartet wird.
quelle
Ich bin mir nicht sicher, ob es so gründlich ist, aber bei jedem Plugin oder Thema sollte die Benutzereingabe bereinigt werden. Datenbankoperationen sollten mit den Methoden $ wpdb-> durchgeführt werden. Alle $ _GET- und $ _POST-Daten sollten bereinigt werden.
Dies ist mehr Best Practice für die PHP-Programmierung als WordPress.
Wenn es also eine WordPress-Funktion gibt, verwenden Sie diese, wenn nicht, bereinigen Sie Ihre Variablen und Eingaben selbst.
Wenn ich zu vage war, stellen Sie bitte eine genauere Frage.
quelle
update_user_meta()
wird durchstripslashes_deep()
undsanitize_meta()
inupdate_metadata()
und dann$wpdb->prepare()
in übergeben$wpdb->update()
. Ich glaube also nicht, dass Sie es desinfizieren müssen. Vermisse ich etwas?