In welchen Kontexten sind Plugins für die Datenvalidierung / -bereinigung verantwortlich?

17

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.

Ian Dunn
quelle
Ich mag diese Frage. Ich habe den gleichen Gedanken wie du. Ich denke, wenn es eine solche Liste gibt, in der wir manuell validieren / desinfizieren müssen, wäre das großartig. +1.
Anh Tran
1
@ Rilwis, siehe bitte meine Antwort. Sie müssen immer validieren. Desinfektion ist schwieriger, da "sicher" vom Kontext abhängt. Im Allgemeinen, wenn der Wordpress - API mit Wordpress-bekannten Daten unter Verwendung von ( the_title(), the_permalink()etc) Sie sind gut , aber mit benutzerdefinierten Daten , die Sie nicht (zB get_post_meta()). Wenn Sie Zweifel haben, reinigen Sie sich selbst - es kann nicht schaden.
Stephen Harris
@ Stephen Harris: Ich habe deinen Kommentar gelesen. Das weiss ich auch. Aber ich bin der gleichen Meinung wie Ian Dunn. Ich denke, der Hauptgrund, den er fragt, ist "genug tun, nicht mehr, nicht weniger".
Anh Tran
1
Eigentlich macht es mir nichts aus, wenn ich auf der Seite der Vorsicht und der Durchführung von zu vielen Überprüfungen / Hygienemaßnahmen irre, aber ich denke, dass es Fälle gibt, in denen zweimaliges Entkommen ein Problem sein kann.
Ian Dunn

Antworten:

15

Hier gibt es zwei Konzepte:

  • Validierung - Sicherstellen, dass die Daten gültig sind , dh eine Ganzzahl ist eine Ganzzahl, ein Datum ist ein Datum (im richtigen Format usw.). Dies sollte kurz vor dem Speichern der Daten erfolgen.
  • Desinfektion - das Datum für die Verwendung im aktuellen Kontext sicher machen (z. B. SQL-Abfragen entziehen oder HTML bei der Ausgabe entziehen ).

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_postHook ausgeführt, bevor er in der Datenbank gespeichert update_post_metawird. 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 dies esc_url()- aber mit Post-Meta, zum Beispiel, es weiß nicht, dass eine URL gespeichert wird - oder was Sie damit tun möchten (wenn Sie drucken esc_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 $wpdbKlasse 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.

Stephen Harris
quelle
Hey Stephan, danke für die Erklärung. Das hat mir geholfen, es ein bisschen besser zu verstehen, aber ich suche wirklich eine Art umfassende Liste, wie das Beispiel, das ich gegeben habe. Es scheint, als ob Ihr Ansatz darin besteht, eine fundierte Vermutung anzustellen, ob WP damit umgeht oder nicht, oder auf der Seite der Vorsicht zu irren und immer zu desinfizieren. Ich würde mich sicherer fühlen, wenn ich eine maßgebliche und umfassende Liste hätte, anstatt mich auf mein Verständnis davon zu verlassen. Ich mache mir auch Sorgen, dass Doppelflucht zu Problemen führen kann.
Ian Dunn
Ich habe auch gerade die Frage aktualisiert, um ein paar Dinge zu klären.
Ian Dunn
0

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.

Ciprian
quelle
3
Ich verstehe, dass es immer saniert werden muss, aber die Frage ist, wer die Sanierung in jeder bestimmten Situation durchführt. Manchmal macht WordPress das automatisch und manchmal muss man es manuell machen. Ich habe die Frage aktualisiert, um sie klarer zu machen.
Ian Dunn
Auch wenn Sie update_user_meta () verwenden, müssen Sie es noch validieren, da die aktualisierten Werte möglicherweise aus einem offengelegten Formular oder aus Benutzereingaben stammen. Wenn es sich um einen Wert handelt, der aus einem Skript stammt, z. B. einer internen Entscheidung, einer if / else-Schleife, sollten Sie ihn nicht bereinigen.
Ciprian
1
Der Wert, an den Sie übergeben, update_user_meta()wird durch stripslashes_deep()und sanitize_meta()in update_metadata()und dann $wpdb->prepare()in übergeben $wpdb->update(). Ich glaube also nicht, dass Sie es desinfizieren müssen. Vermisse ich etwas?
Ian Dunn