Was ist der Unterschied zwischen dem Filter esc_html und dem Filter attribute_escape?

8

Was ist der genaue Unterschied zwischen esc_htmlund attribute_escapeFilter?

esc_html()verwendet esc_html filterund esc_attr()verwendet attribute_escape filter. Beide codieren <> & "'(kleiner als, größer als, kaufmännisches Und, doppeltes Anführungszeichen, einfaches Anführungszeichen).

Ich bin interessiert zu wissen, was sie genau in Bezug auf Sicherheit (Flucht) unterscheidet.

djadmin
quelle
Nun, wenn sie nicht verschieden wären, wäre es nicht nötig, die beiden zu haben ... Die Frage IMO ist einfach nicht klar, es ist wie zu fragen, was der Unterschied zwischen den Filtern "Inhalt" und "Auszug" ist
Mark Kaplun
1
Ich denke, das ist es, was er fragt, wie unterscheiden sie sich und warum?
Tom J Nowell
@ TomJNowell, nun, einer wird aufgerufen, um Attribute zu entkommen, und der andere, um allgemeinem HTML zu entkommen. Das erklärt das Warum und meistens auch das Wie;) Wo soll hier eine Antwort beginnen, mit der Erklärung des Unterschieds zwischen den in Attributen zulässigen Zeichen und allgemeinem HTML? das klingt ein wenig zu einfach (könnte aber das sein, wonach das OP fragt, denke ich)
Mark Kaplun
2
Das wäre gut, aber ein Beispiel für etwas esc_attr, esc_htmldas nicht nützlich wäre, warum nicht esc_htmlüberall verwenden? Wenn es für Sie offensichtlich ist, scheint es keine gute Frage zu sein, aber für den Fragesteller ist es nicht offensichtlich, wie sich diese beiden Funktionen unterscheiden, da beide den erwarteten Zeichen entkommen
Tom J Nowell

Antworten:

8

Es scheint, dass es nach dem Auspacken keinen Unterschied gibt

function esc_html( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in HTML.
     *
     * Text passed to esc_html() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.8.0
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'esc_html', $safe_text, $text );
}
function esc_attr( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in an HTML attribute.
     *
     * Text passed to esc_attr() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.0.6
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'attribute_escape', $safe_text, $text );
}

Der einzige Unterschied zwischen den beiden Funktionen ist der am Ende angewendete Filter. WordPress fügt diesen Filtern nichts hinzu, daher sind sie in einer Standard-WP-Installation keine Operationen. Sie werden im Randfall bereitgestellt, damit jemand sie benötigt.

Schnelle Fragen und Antworten

Also sind sie standardmäßig identisch?

Ja! Die esc_attrund esc_htmlFunktionen haben die gleiche Implementierung

Sind die Filter identisch?

Der einzige Unterschied besteht darin, dass sie unterschiedliche Namen haben, auf die gleiche Weise funktionieren, auf die gleiche Weise verwendet werden und keiner der Filter im Kern verwendet wird.

Tun die Filter etwas?

Nein! Alle Escape-Aktionen werden in der Funktion ausgeführt, wenn wp_check_invalid_utf8und _wp_specialcharsaufgerufen werden.

Die Filter entkommen nicht, sie bieten Plugins die Möglichkeit, zusätzliche Überprüfungen und Verarbeitungen durchzuführen.

Gibt es Randfälle?

Nur wenn Sie die Filter verwenden, sagen Sie, dass Sie angeschlossen sind, esc_htmlaber nicht attribute_escape, oder umgekehrt. Bei einer Standard-WP-Installation sind die beiden Funktionen identisch, ohne Unterschied.

Warum attribute_escapeund nicht esc_attr?

Abwärtskompatibilität. Früher gab es eine attribute_escapeFunktion, die jetzt nach dem esc_Hinzufügen der Stilfunktionen als veraltet markiert wird .

Warum sollte ich diese Filter verwenden?

¯\_(ツ)_/¯Dies wäre eine seltene Situation. Einige Leute missbrauchen es möglicherweise auf die gleiche Weise, wie Übersetzungs-APIs missbraucht werden, um nach Ersatztext zu suchen. Dies ist bereits eine schlechte Praxis, da diese Filter häufig als kleiner Geschwindigkeitsverlust bezeichnet werden, der tausendfach vergrößert wird

Bedenken Sie jedoch, dass Sie die Sicherheit dieser Funktionen gefährden können, wenn Sie nicht aufpassen. Aus diesem Grund sind die Filter gefährlich.

Muss ich mir darüber Sorgen machen?

Nein. Sie müssen sich nur Sorgen machen, wenn Sie diese Filter verwendet haben, die für sich genommen massive rote Alarme hätten auslösen müssen, dass etwas in Ihrer Entwicklung ernsthaft schief gelaufen ist.

Die Funktionen esc_attrund esc_htmlsind sicher zu bedienen und entgehen Inhalten. Sie haben eine ethische und moralische Verpflichtung, sie zu verwenden, wenn Sie die Sicherheit Ihres Codes schätzen

Heißt das, ich sollte nur verwenden esc_html?

Nein, bei der Flucht geht es darum, Erwartungen zu setzen. Wenn Sie ein Attribut erwarten, verwenden Sie esc_attr. Nur weil es momentan funktional gleich ist, heißt das nicht, dass sich dies mit einer Sicherheitsversion in Zukunft nicht ändern wird

Tom J Nowell
quelle
Danke für die Antwort. Vielleicht muss ich meine Frage umformulieren. Ich bin mehr daran interessiert zu wissen, ob es einen Unterschied in der Kernimplementierung der beiden oben genannten Filter gibt. Dies würde uns (Entwicklern) wirklich helfen zu wissen, wie Escape in Attributen und HTML funktioniert.
Djadmin
Diese Filter werden von Core nicht verwendet, sondern werden bei Bedarf für Plugins bereitgestellt. Ich rate jedoch dringend davon ab, sie aus Sicherheitsgründen zu verwenden
Tom J Nowell
"Die Filter esc_html und attribute_escape sind daher sehr gefährlich." Ich verstehe diesen Punkt wirklich nicht. Wenn wir dies nicht verwenden, wie sollen wir dann Benutzereingaben entgehen, um XSS zu verhindern?
Djadmin
Wie Sie sagten, durchlaufen sie vor dem Verlassen einen Filter. Meine ursprüngliche Frage ist, wie sich diese beiden Filter in Bezug auf die Implementierung unterscheiden. Ich glaube, es würde einen Randfall geben, bei dem esc_htmlFilter entkommen und attribute_escapeFilter nicht oder umgekehrt.
Djadmin
Sie tun es nicht. Die Filter werden für Code von Drittanbietern bereitgestellt und von Core nicht verwendet. Core hakt sich nicht in die Filter ein und macht auch nichts mit ihnen. Diese Randfälle müssten von einem Theme- oder Plugin-Entwickler geschrieben werden. Zu diesem Zeitpunkt wäre es offensichtlich, dass Sie die Person sind, die sie geschrieben hat
Tom J Nowell