Warum entkommen, wenn der Inhalt nicht vorhanden ist?

8

Die eingebaute Funktion the_contentdurchläuft mehrere Filter, entgeht jedoch nicht der Ausgabe. Es wäre schwierig, dies zu tun, da HTML und sogar einige Skripte durchgelassen werden müssen.

Bei der Ausgabe scheint der Inhalt diese Filter zu durchlaufen (ab 5.0):

add_filter( 'the_content', 'do_blocks', 9 );
add_filter( 'the_content', 'wptexturize' );
add_filter( 'the_content', 'convert_smilies', 20 );
add_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'shortcode_unautop' );
add_filter( 'the_content', 'prepend_attachment' );
add_filter( 'the_content', 'wp_make_content_images_responsive' );

(and)

add_filter( 'the_content', 'capital_P_dangit' );
add_filter( 'the_content', 'do_shortcode' );

Es wird auch eine einfache Zeichenfolge ersetzt:

$content = str_replace( ']]>', ']]>', $content );

Und dann macht get_the_content ein kleines Stück Verarbeitung im Zusammenhang mit dem "more" -Link und einem Fehler mit Fremdsprachen.

Keiner davon verhindert die Injektion von XSS-Skripten, oder?

Beim Speichern der Daten wird durch wp_kses_post hygienisiert. Da dies jedoch ein teurer Prozess ist, verstehe ich, warum er nicht für die Ausgabe verwendet wird.

Die Faustregel für das Escaping von WordPress lautet, dass alles maskiert werden muss, unabhängig von der Eingabe-Hygiene und so spät wie möglich. Ich habe mehrere Artikel gelesen, in denen dies gesagt wird, da die Datenbank nicht als vertrauenswürdige Quelle anzusehen ist.

Aber aus den oben genannten Gründen folgt the_content dem nicht. Die Kernthemen (z. B. TwentyNineteen) fügen der Ausgabe auch kein zusätzliches Escapezeichen hinzu.

Also ... warum hilft es irgendetwas, woanders zu fliehen? Wenn ich ein Hacker mit Zugriff auf die Datenbank wäre, würde ich dann nicht einfach meinen Code zum Inhalt eines Posts hinzufügen?

tmdesigned
quelle
Sie haben vergessenwp_kses_post
Tom J Nowell
Es läuft durch wp_kses_post bei der Ausgabe? Wo?
tmdesigned

Antworten:

10

Wenn ich ein Hacker mit Zugriff auf die Datenbank wäre, würde ich dann nicht einfach meinen Code zum Inhalt eines Posts hinzufügen?

Wenn Sie Zugriff auf die Datenbank haben, haben Sie wahrscheinlich genug Zugriff, sodass Sie durch das Entkommen nicht aufgehalten werden. Flucht hilft dir nicht, wenn du gehackt wurdest. Das soll es nicht. Es gibt noch andere Gründe zu fliehen. Die beiden wichtigsten, an die ich denken kann, sind:

Umgang mit nicht bereinigten Eingaben

Der Inhalt von WordPress-Posts wird beim Speichern bereinigt, aber nicht alles andere. Inhalte, die über eine Abfragezeichenfolge in der URL übergeben werden, werden beispielsweise nicht bereinigt. Inhalt in Übersetzungsdateien ist auch nicht unbedingt erforderlich. Beides sind Inhaltsquellen, die nichts mit der Gefährdung der Website zu tun haben. Daher müssen übersetzbarer Text und Inhalt, der aus der URL abgerufen wurde, maskiert werden.

Um zu verhindern, dass Benutzer versehentlich das Markup brechen

Flucht dient nicht nur der Sicherheit. Sie benötigen es auch, um zu verhindern, dass Benutzer versehentlich das Markup ihrer Website beschädigen. Wenn der Benutzer beispielsweise Anführungszeichen oder >Symbole in einen Inhalt Ihres Plugins einfügt, um das Markup zu beschädigen, sollten Sie diese Ausgabe umgehen. Sie möchten bei der Bereinigung von Eingaben nicht zu aggressiv sein, da es durchaus gültige Gründe gibt, warum ein Benutzer diese Zeichen verwenden möchte.


„Bei der Flucht geht es nicht nur darum, sich vor bösen Jungs zu schützen. Es macht unsere Software nur langlebig. Gegen zufällige schlechte Eingaben, gegen böswillige Eingaben oder gegen schlechtes Wetter. “

Das geht aus den WordPress VIP-Richtlinien zum Entkommen hervor . Es gibt viel mehr zu diesem Thema zu sagen, und Sie sollten es lesen.

Jacob Peattie
quelle
Danke, das ist hilfreich. Ich hatte einen VIP-Beitrag über Flucht gelesen und der Autor erwähnte ausdrücklich die Idee, dass jemand Zugriff auf die Datenbank erhalten hat, aber nicht auf den Server. Ich denke jedoch, dass Ihre Argumentation in diesem Punkt sinnvoller ist. Und ich nehme an, manchmal entkommen Sie anfälligen Inhalten aus der Datenbank, auch ohne dass jemand vollständigen Zugriff auf die Datenbank hatte, dh über ein Plugin oder sogar nur einen Kommentar.
tmdesigned
9

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_htmlFunktionen verfügen, sodass diese bei der Ausgabe nicht entweichen können. Stattdessen wird es wp_kses_postbei 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_contentFilter 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 $urleine URL, die für ein hrefAttribut 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 $urloder 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_contentnicht? 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_contentder 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_htmlFunktion aus allen Rollen entfernen können

Tom J Nowell
quelle
1
Danke für die zusätzliche Perspektive. Ich hatte Ihren Beitrag zu diesem Thema auf Ihrer Website tatsächlich gelesen und mich gefragt, ob Sie etwas hinzufügen möchten.
tmdesigned
4

Der Fluchtpunkt besteht darin, gültiges HTML zu generieren. Die zusätzliche Sicherheit, die es bietet, ist nur ein netter Nebeneffekt.

Die auf den Inhalt angewendeten Filter generieren einen gültigen HTML-Code aus einer Mischung aus HTML und anderem Text mit einer anderen Syntax wie Shortcodes. Die Tatsache, dass ein Teil des Inhalts bereits gültiges HTML ist, verhindert, dass auf alles ein Escapezeichen angewendet wird.

Wie für ksesverwandte Funktionen können, können Sie sie in erster Linie nicht anwenden , weil Sie nicht genug Kontext müssen zu wissen , welche zu benutzen. Zum Beispiel könnte es einen Prozess geben, der den the_contentFilter verwendet, um JS zum Post-Inhalt hinzuzufügen, weshalb der Kern anhand von Dingen wie dem Post-Autor nicht erraten kann, ob der JS legitim ist oder nicht.

Also ... warum hilft es irgendetwas, woanders zu fliehen? Wenn ich ein Hacker mit Zugriff auf die Datenbank wäre, würde ich dann nicht einfach meinen Code zum Inhalt eines Posts hinzufügen?

Das Escape dient wiederum zum Generieren von gültigem HTML. Von einem Sicherheits-POV aus ist es nicht so, dass das Entkommen Sicherheit bietet, sondern dass ein Code, der das Entkommen glücklich macht, verdächtig sein sollte, da er möglicherweise einfacher auszunutzen ist. Die Art _eund Weise, wie Core und '__' für Übersetzungen verwendet, bedeutet beispielsweise, dass jeder, der Sie davon überzeugen kann, eine nicht offizielle Übersetzung zu installieren, möglicherweise schwer zu erkennende JS in der Übersetzungsdatei hinzufügen und Ihre Site hacken kann. Dies ist ein gutes Beispiel für "Tu was ich sage und nicht was ich tue".

Mark Kaplun
quelle
Danke, Mark, für die zusätzliche Perspektive.
tmdesigned
2

Wenn ich ein Hacker mit Zugriff auf die Datenbank wäre, würde ich dann nicht einfach meinen Code zum Inhalt eines Posts hinzufügen?

Ich denke, Ihre Frage beantwortet sich von selbst. Wenn Sie ein Hacker mit Zugriff auf die Datenbank waren, haben Sie bereits den gewünschten Zugriff erhalten. Das Entweichen der Ausgabe ändert daran überhaupt nichts.

Der Grund für das Entgehen der Ausgabe ist die Auswertung nicht vertrauenswürdiger Daten, um zu verhindern, dass der Hacker diesen Zugriff überhaupt erhält.

Butlerblog
quelle
Danke für deine Antwort. Ich glaube, ich habe mich zu sehr auf die Idee konzentriert, einen Hacker zu verhindern, dass ich den Wald vor lauter Bäumen verpasst habe.
tmdesigned