Ich bin eigentlich ein Ingenieur bei VIP, der viel Code überprüft :) Ich melde eine Menge fehlender Flucht.
entgeht aber nicht der Ausgabe
Nicht ganz, es entweicht nicht bei der Ausgabe, was für die meisten Menschen überraschend ist. Dies liegt daran, dass Sie als Superadministrator über die entsprechenden unfiltered_html
Funktionen verfügen, sodass diese bei der Ausgabe nicht entweichen können. Stattdessen wird es wp_kses_post
bei der Eingabe durchlaufen . Idealerweise würden Sie diese Funktion jedoch entfernen.
Hier ist die Implementierung zum aktuellen Zeitpunkt:
function the_content( $more_link_text = null, $strip_teaser = false ) {
$content = get_the_content( $more_link_text, $strip_teaser );
/**
* Filters the post content.
*
* @since 0.71
*
* @param string $content Content of the current post.
*/
$content = apply_filters( 'the_content', $content );
$content = str_replace( ']]>', ']]>', $content );
echo $content;
}
Der ideale Mechanismus, um alles zu entkommen, was durch den the_content
Filter geht, ist:
echo apply_filters( 'the_content', wp_kses_post( $content ) );
Auf diese Weise machen wir den Inhalt sicher und führen ihn dann durch den Filter, um zu vermeiden, dass die Einbettungen usw. entfernt werden.
Warum also fliehen?
Der Fluchtpunkt besteht darin, gültiges HTML zu generieren. Die zusätzliche Sicherheit, die es bietet, ist nur ein netter Nebeneffekt.
Um zu verhindern, dass Benutzer versehentlich das Markup brechen
Es gibt viele Gründe zu entkommen, aber im Grunde setzen Sie die Erwartungen durch. Nehmen Sie den folgenden Code:
<a href="<?=$url?>">
Wir erwarten $url
eine URL, die für ein href
Attribut geeignet ist , aber was ist, wenn dies nicht der Fall ist? Nun, warum es dem Zufall überlassen, lassen Sie es uns durchsetzen:
<a href="<?=esc_url( $url )?>">
Es wird jetzt immer eine URL sein. Es spielt keine Rolle, ob ein Hacker ein Bild einfügt $url
oder ob ein Benutzer das falsche Feld eingibt oder ob ein bösartiges Skript vorhanden ist. Es wird immer eine gültige URL sein, da wir gesagt haben, dass es eine URL sein wird. Sicher, es könnte eine sehr seltsame URL sein, aber es wird immer die Erwartung erfüllen, dass eine URL dort sein wird. Dies ist sehr praktisch, sei es für die Markup-Validierung, für die Sicherheit usw.
Flucht ist jedoch keine Bestätigung, Flucht ist keine Desinfektion. Dies sind separate Schritte, die an verschiedenen Punkten im Lebenszyklus ausgeführt werden. Das Entkommen zwingt die Dinge dazu, die Erwartungen zu erfüllen, auch wenn es sie dazu bringt, dies zu tun.
Manchmal denke ich gerne daran, als eine dieser japanischen Gameshows mit der riesigen Schaumstoffwand mit dem Ausschnitt zu fliehen. Die Teilnehmer müssen in die Hundeform passen oder sie werden weggeworfen, nur für unsere Zwecke gibt es Laser und Messer um das Loch. Was am Ende noch übrig ist, wird hundeförmig sein, und es wird unversöhnlich und streng sein, wenn Sie nicht bereits hundeförmig sind.
Merken:
- früh desinfizieren
- frühzeitig validieren
- entkomme spät
- oft entkommen
Sicherheit ist ein mehrstufiger, mehrschichtiger Verteidigungszwiebel. Das Entkommen ist eine der äußeren Verteidigungsschichten bei der Ausgabe. Es kann den Angriffscode auf einer kompromittierten Site beschädigen, ihn unbrauchbar machen, offene Exploits vereiteln und sicherstellen, dass Ihr Client eine Site nicht beschädigt, indem er Tags in ein Feld einfügt, das er nicht sollte. Es ist kein Ersatz für die anderen Dinge und bei weitem das am wenigsten genutzte Sicherheitstool in einem Entwicklerhandbuch.
Warum fliehen, wenn the_content
nicht? Wenn eine Flut kommt und 5 Löcher in einer Wand, aber nur Zeit, 3 zu reparieren, zucken Sie mit den Schultern und reparieren keine? Oder verringern Sie das Risiko und reduzieren den Angriffsbereich?
Vielleicht kann ich helfen, diese letzten 2 Löcher mit diesem Ausschnitt zu reparieren:
add_filter( 'the_content' function( $content ) {
return wp_kses_post( $content );
}, PHP_INT_MAX + 1 );
Hier setzen wir die Priorität auf die höchstmögliche Zahl in PHP und addieren dann 1, damit sie auf die niedrigstmögliche Zahl überläuft, die dargestellt werden kann. Auf diese Weise wird bei allen Aufrufen von the_content
der Wert vor allen anderen Filtern ausgeblendet. Auf diese Weise funktionieren Einbettungen usw. immer noch, aber Benutzer können sich nicht über die Datenbank in gefährliches HTML einschleichen. Überprüfen Sie außerdem, ob Sie die unfiltered_html
Funktion aus allen Rollen entfernen können
wp_kses_post