Desinfizieren und Datenvalidierung mit der Funktion apply_filters ()

7

Sollten wir apply_filters()die folgenden Beispiele bereinigen und validieren ?

  1. absint( apply_filters( 'slug_excerpt_length', 35 ) );

  2. wp_kses_post( apply_filters( 'slug_excerpt_more', '…' ) );

  3. esc_url( apply_filters( 'slug_login_url', home_url( '/' ) ) );

Ich stelle diese Frage, weil ich das noch nie gesehen habe. Tatsächlich fügen wir eine Validierung hinzu, um zu verhindern, dass etwas kaputt geht, wenn der Benutzer etwas Falsches im untergeordneten Thema hinzufügt.

Ich frage mich, was du darüber denkst.

Asaf
quelle

Antworten:

16

Hier gibt es einige Verwirrung, da nicht alle davon eine Validierung sind, sondern zwei andere, die notwendig sind, um zu verstehen, was angemessen ist:

  • Validierung
  • Desinfektion
  • entkommen

Desinfektion

Desinfektion macht die Dinge sauber und gut geformt

Dies bereinigt die Daten, z. B. das Trimmen von Leerzeichen, das Entfernen von Buchstaben in einem Zahlenfeld, das Erstellen eines Kleinbuchstabenfeldes in Kleinbuchstaben usw.

ZB Der Benutzer hat eingegeben " Banana ", also verwandeln Sie es in"Banana"

Desinfektion ist das erste, was bei Eingaben passieren sollte, die von einem anderen Ort stammen, z. B. bei der Verarbeitung eines Formulars. Bereinigen Sie die Daten, bevor Sie etwas damit tun. Das gleiche gilt für alle Daten, die von einer Remoteverbindung usw. Stammen

Beliebte Desinfektionsmethoden sind:

  • Entfernen von HTML oder bestimmten Tags über wp_kses wp_strip_all_tagsetc.
  • Entfernen von Zeichenbereichen, z. B. nicht numerischen Zeichen oder Satzzeichen
  • Trimmen von nachfolgenden Zeichen wie Leerzeichen usw.
  • Anwenden von Grenzen, z. B. Beschränken von Werten auf einen Bereich (dies könnte stattdessen als Validierungsprüfung implementiert werden)

Validierung

Die Validierung prüft, ob die Dinge gültig sind

Die Validierung überprüft, ob die vom Benutzer eingegebene Telefonnummer tatsächlich eine Telefonnummer ist. Es ist ein trueoder falseScheck.

ZB Ist die Frucht, die der Benutzer ausgewählt hat, tatsächlich eine Frucht?

Dies sollte bei der Eingabe nach der Bereinigung erfolgen. Wenn die Validierung fehlschlägt, brechen Sie ab. Zu den gängigen Validierungsmethoden gehören:

  • Funktionen wie is_numericetc.
  • reguläre Ausdrücke, nützlich für Dinge wie Telefonnummern oder URLs, Dinge, die ein erwartetes Format haben
  • Durch Überprüfen der Rollen und Funktionen, um zu überprüfen, ob der Benutzer tatsächlich die beabsichtigte Aktion ausführen kann
  • Nonce-Checks
  • Whitelists mit vordefinierten zulässigen Werten
  • Überprüfungswerte liegen innerhalb gültiger Bereiche, z. B. hat niemand eine 200 Zeichen lange Telefonnummer, noch würde jemand in der Hausnummer leben -2000000

Flucht

Das Escaping macht Werte für die Ausgabe sicher und erzwingt Annahmen

Entkomme spät, entkomme oft.

Über das Entkommen wird nicht viel gesprochen, aber stellen Sie es sich anhand des Fruchtbeispiels von oben vor. Das Entkommen ist wie ein Förderband mit einem fruchtförmigen Ausschnitt. Am Ende bekommt man immer etwas Fruchtförmiges. Wenn eine Frucht durchgeht, ist sie unberührt, aber wenn ein böswilliger Schauspieler durchgeht, erscheint am Ende eine verstümmelte, aber sichere Version in Fruchtform.

Beim Escaping geht es daher darum, Annahmen durchzusetzen. In einem <a>Tag sollte das hrefAttribut beispielsweise eine URL enthalten. Dies ist jedoch möglicherweise nicht der Fall. Durch das Entkommen können wir das "sollte enthalten" gegen ein "wird immer enthalten" tauschen, was uns eine Garantie bietet. Dies verhindert, dass jemand seine URL mit "/>beliebigem HTML startet und einfügt.

Das Escaping sollte immer bei der Ausgabe erfolgen , und zwar zum spätestmöglichen Zeitpunkt, um sicherzustellen, dass nichts geändert wurde. Escaping ist auch kontextsensitiv. Sie würden verwenden esc_attr, um HTML-Attribute zu maskieren, aber wenn es ein hrefoder srcAttribut ist, würden wir verwenden, esc_urlum anzugeben, dass es sich um eine URL handelt, die wir ausgeben möchten .

Ein Hinweis zu Double Escaping und wp_kses

Sie können mehrmals bereinigen und validieren, aber Sie sollten einen Wert nur einmal maskieren. Dies liegt daran, dass durch doppeltes Escapezeichen Werte doppelt codiert werden können und unter bestimmten Umständen Inhalte aus dem Escapezeichen ausbrechen können.

wp_kses_postund wp_ksessind auch insofern ungewöhnlich, als sie zum Entkommen und Desinfizieren verwendet werden können und mehrfach für einen Wert verwendet werden können.

Ein Hinweis zum frühen Entkommen

Dies ist eine beinahe tödliche Sünde, die fast alles ungeschehen machen kann, was dir entkommt. Sobald etwas maskiert wurde, wissen wir, dass es sicher ist, es auszugeben, aber wenn wir es dann einer Variablen zuweisen, wer weiß, was zwischen Escape und Ausgabe passieren kann. Wenn diese Variable geändert, an eine Funktion übergeben oder durch einen Filter geleitet wird, ist sie nicht mehr sicher, ihr Status ist ein Rätsel. Wir können es wieder entkommen, aber jetzt sind wir doppelt entkommen, sodass wir sichere Daten möglicherweise gefährlich gemacht oder gute Daten verstümmelt haben.

Also über diese Filter

Sollten wir apply_filters()die folgenden Beispiele bereinigen und validieren ?

Das hängt vom Kontext ab

Bei Eingabe:

  • Desinfizieren
  • dann validieren
  • Wenn es gültig ist, fahren Sie fort, andernfalls lehnen Sie ab

Bei der Ausgabe an den Browser / Anfragen / etc:

  • Sie können nach dem Abrufen aus der Datenbank bereinigen und validieren, wenn Sie möchten. Die Priorität Nr. 1 besteht jedoch darin, zu entkommen, nur einmal zu entkommen und dies im Moment der Ausgabe zu tun. Speichern Sie es nicht in einer Variablen, die früh entkommt und gefährlich ist
  • Entkommen Sie nach dem Filtern, nicht vorher, wer weiß, was der Filter mit einem bekannten sicheren Wert gemacht hat. Sobald der Wert vom Filter zurückgegeben wird, sind seine Sicherheit und sein Status ein Rätsel
  1. absint( apply_filters( 'slug_excerpt_length', 35 ) );

Gut, dass wir jetzt wissen, dass dieser Wert definitiv eine Zahl ist und auch eine positive Zahl. Wenn wir dieser Anweisung ein Präfix voranstellen, ist dies echoein sicherer Escape-Wert. Sonst ist es nur die Desinfektion, die den Wert aufräumt.

  1. wp_kses_post( apply_filters( 'slug_excerpt_more', '&hellip;' ) );

Großartig, dies ist sowohl eine Desinfektion als auch eine Flucht, wenn wir es sofort ausgeben, aber wenn wir es in einer Variablen speichern, ist es nur eine Desinfektion.

  1. esc_url( apply_filters( 'slug_login_url', home_url( '/' ) ) );

Dies entgeht und benötigt eine echoErklärung. Wenn wir dies einer Variablen zuweisen, war das Entkommen umsonst und wir führen eine prekäre Situation ein.

Wenn die Frage andererseits lautet, sollten wir die Rückgabewerte von Filtern überprüfen? Ja, das wäre klug, aber übervorsichtig. In diesem Szenario würde ich erwarten, dass dies auf Filter getestet wird, die nicht ordnungsgemäß implementiert sind, z. B. die Rückgabe von Text, bei dem eine Zahl erwartet wird. In diesem Szenario ist die Validierung die einzige Option. Flucht und Desinfektion wären unangemessen.

Ausnahmen

  • Wenn Sie the_contentFilter verwenden, geben Sie den Wert durch wp_kses_postund geben Sie ihn dann in den Filter und sofortiges Echo ein, zecho apply_filters( 'the_content', wp_kses_post( $dangerous ) );
  • Escape-Zeichen und verwenden Sie in Shortcodes Ausgabepuffer, wenn Sie müssen, damit Sie eine Zeichenfolge zurückgeben können
Tom J Nowell
quelle
Dies ist eine wirklich gute Erklärung. Ich habe nicht so viele Informationen erwartet. Danke Jungs. <3
Asaf