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_tags
etc.
- 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 true
oder false
Scheck.
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_numeric
etc.
- 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 href
Attribut 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 href
oder src
Attribut ist, würden wir verwenden, esc_url
um 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_post
und wp_kses
sind 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
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 echo
ein sicherer Escape-Wert. Sonst ist es nur die Desinfektion, die den Wert aufräumt.
wp_kses_post( apply_filters( 'slug_excerpt_more', '…' ) );
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.
esc_url( apply_filters( 'slug_login_url', home_url( '/' ) ) );
Dies entgeht und benötigt eine echo
Erklä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_content
Filter verwenden, geben Sie den Wert durch wp_kses_post
und 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