Was ist der Unterschied zwischen esc_html, esc_attr, esc_html_e und so weiter?

12

Ich erhielt eine Rückmeldung vom Sicherheitsbeamten und er wies darauf hin, dass ich die Benutzereingaben in meinem Code ordnungsgemäß maskieren sollte. Also habe ich einige Nachforschungen angestellt und Fluchtfunktionen gefunden.

Was ist der Unterschied zwischen ihnen? Wann soll ich esc_html()wann verwenden esc_attr()? Und wann soll ich diese Funktionen _e()am Ende nutzen?

Baldrick
quelle
1
Hast du die Dokumentation gelesen ?
Jacob Peattie
2
Ja und das hat mich noch mehr verwirrt :(
baldrick

Antworten:

19

esc_html()entgeht einer Zeichenfolge, damit sie nicht als HTML analysiert wird. Zeichen wie <werden beispielsweise in konvertiert &lt;. Dies sieht für den Leser gleich aus, bedeutet jedoch, dass der ausgegebene Wert <script>vom Browser nicht als tatsächliches Skript-Tag interpretiert wird.

Verwenden Sie diese Funktion immer dann, wenn der ausgegebene Wert kein HTML enthalten soll.

esc_attr()entgeht einer Zeichenfolge, damit sie sicher in einem HTML-Attribut verwendet werden kann, wie class=""zum Beispiel. Dies verhindert, dass ein Wert aus dem HTML-Attribut ausbricht. Wenn der Wert beispielsweise lautet "><script>alert();</script>und Sie versucht haben, ihn in einem HTML-Attribut auszugeben, wird das aktuelle HTML-Tag geschlossen und ein Skript-Tag geöffnet. Das ist unsicher. Wenn Sie dem Wert entkommen, können Sie das HTML-Attribut nicht schließen und unsicheres HTML markieren und ausgeben.

Verwenden Sie diese Funktion, wenn Sie einen Wert innerhalb eines HTML-Attributs ausgeben.

esc_url() maskiert eine Zeichenfolge, um sicherzustellen, dass es sich um eine gültige URL handelt.

Verwenden Sie diese Funktion, wenn Sie einen Wert innerhalb eines Attributs href=""oder ausgeben src="".

esc_textarea()entgeht einem Wert, damit er sicher in einem <textarea>Element verwendet werden kann. Durch das Escapezeichen eines Werts mit dieser Funktion wird verhindert, dass ein Wert, der in a ausgegeben wird <textarea<, das <textarea>Element schließt und seinen eigenen HTML-Code ausgibt.

Verwenden Sie diese Funktion, wenn Sie einen Wert innerhalb eines <textarea>Elements ausgeben .

esc_html()und esc_attr()haben auch Versionen __(), die mit _e()und enden _x(). Diese dienen zur Ausgabe übersetzbarer Zeichenfolgen.

Wordpress hat Funktionen, __(), _e()und _x(), für Text ausgibt , das übersetzt werden kann. __() liefert eine übersetzbar Zeichenfolge, _e() Echos ein übersetzbaren String und _x()einen übersetzbaren String mit einem bestimmten Kontext zurückgibt. Sie haben sie wahrscheinlich schon einmal gesehen.

Da Sie nicht unbedingt darauf vertrauen können, dass eine Übersetzungsdatei sichere Werte enthält, wird durch die Verwendung dieser Funktionen bei der Ausgabe einer übersetzbaren Zeichenfolge sichergestellt, dass die ausgegebenen Zeichenfolgen nicht das oben beschriebene Problem verursachen können.

Verwenden Sie diese Funktionen, wenn Sie übersetzbare Zeichenfolgen ausgeben.

Jacob Peattie
quelle
2
Beachten Sie, dass standardmäßig kein Unterschied zwischen esc_htmlund besteht esc_attrund derselbe Code verwendet wird (sie haben nur einen anderen nicht verwendeten Filter): wordpress.stackexchange.com/questions/264698/…
Taufe
4

esc_htmlwürde innerhalb von HTML zum Beispiel zwischen einem <p>Tag verwendet werden

<p><?php echo esc_html( $some_variable ); ?></p>

esc_attr würde verwendet werden, um Attributwerte auf HTML-Tags wie folgt zu maskieren:

<p my-attribute="<?php echo esc_attr( $some_variable ); ?>"></p>

Das Anwenden _ebis zum Ende dient zur Verwendung mit Textdomänen und gibt es automatisch für Sie wieder, z. B.:

<p><?php esc_html_e( 'some-text', 'text-domain' ); ?></p>

<p my-attribute="<?php esc_attr_e( 'some-text', 'text-domain' ); ?>"></p>

Darüber hinaus _egibt es auch das, __was dasselbe _etut, es aber nicht wiedergibt, sodass Sie es in einer Variablen speichern können.

jrmd
quelle
2
_edient nicht nur dem Echo, sondern auch der Lokalisierung. Daher sollte es nur verwendet werden, wenn eine Zeichenfolge an die Funktion übergeben wird, und sollte eine Textdomäne enthalten. Ihr letztes Beispiel ist der Missbrauch.
Jacob Peattie
@JacobPeattie meine schlecht, ich werde aktualisieren ... EDIT Feste
jrmd