Quelle est la différence entre esc_html, esc_attr, esc_html_e, etc.?

12

J'ai reçu des commentaires du responsable de la sécurité et il a souligné que je devais utiliser l'échappement approprié des entrées utilisateur dans mon code. J'ai donc fait quelques recherches et trouvé des fonctions d'échappement.

Quelle est la différence entre eux? Quand dois-je utiliser esc_html()et quand esc_attr()? Et quand dois-je utiliser ces fonctions _e()à la fin?

Baldrick
la source
1
Avez-vous lu la documentation ?
Jacob Peattie
2
Oui et cela m'a encore plus
troublé

Réponses:

19

esc_html()échappe une chaîne afin qu'elle ne soit pas analysée en HTML. Des caractères comme <sont convertis &lt;, par exemple. Cela ressemblera au lecteur, mais cela signifie que si la valeur en cours de sortie est <script>alors elle ne sera pas interprétée par le navigateur comme une balise de script réelle.

Utilisez cette fonction chaque fois que la valeur en sortie ne doit pas contenir de code HTML.

esc_attr()échappe une chaîne afin de pouvoir l'utiliser en toute sécurité dans un attribut HTML, comme class=""par exemple. Cela empêche une valeur de sortir de l'attribut HTML. Par exemple, si la valeur est "><script>alert();</script>et que vous avez essayé de la sortir dans un attribut HTML, elle fermerait la balise HTML actuelle et ouvrirait une balise de script. C'est dangereux. En échappant à la valeur, il ne sera pas en mesure de fermer l'attribut et la balise HTML et de sortir du HTML non sécurisé.

Utilisez cette fonction lors de la sortie d'une valeur à l'intérieur d'un attribut HTML.

esc_url() échappe une chaîne pour vous assurer qu'il s'agit d'une URL valide.

Utilisez cette fonction lors de la sortie d'une valeur à l'intérieur d'un attribut href=""ou src="".

esc_textarea()échappe une valeur pour pouvoir l'utiliser en toute sécurité dans un <textarea>élément. En échappant une valeur avec cette fonction, cela empêche qu'une valeur soit sortie à l'intérieur de a <textarea<de fermer l' <textarea>élément et de sortir son propre HTML.

Utilisez cette fonction lors de la sortie d'une valeur à l'intérieur d'un <textarea>élément.

esc_html()et esc_attr()ont également des versions se terminant par __(), _e()et _x(). Ce sont pour la sortie de chaînes traduisibles.

WordPress a des fonctions, __(), _e()et _x(), pour produire du texte qui peut être traduit. __() renvoie une chaîne traduisible, _e() fait écho à une chaîne traduisible et _x()renvoie une chaîne traduisible avec un contexte donné. Vous les avez probablement déjà vus.

Étant donné que vous ne pouvez pas nécessairement faire confiance à un fichier de traduction pour contenir des valeurs sûres, l'utilisation de ces fonctions lors de la sortie d'une chaîne traduisible garantit que les chaînes en cours de sortie ne peuvent pas provoquer le même problème décrit ci-dessus.

Utilisez ces fonctions lors de la sortie de chaînes traduisibles.

Jacob Peattie
la source
2
Notez que par défaut, il n'y a aucune différence entre esc_htmlet esc_attr, le même code est utilisé (ils ont juste un filtre inutilisé différent): wordpress.stackexchange.com/questions/264698/…
baptx
4

esc_htmlserait utilisé à l'intérieur de html par exemple entre une <p>balise

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

esc_attr serait utilisé pour échapper les valeurs d'attribut sur les balises html comme ceci:

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

appliquer _eà la fin est de l'utiliser avec des domaines de texte et le répercutera automatiquement pour vous, par exemple:

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

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

en plus _eil y en a aussi __qui fait la même chose que _emais ne l'écho pas afin que vous puissiez le stocker dans une variable.

jrmd
la source
2
_en'est pas seulement pour l'écho, c'est pour la localisation. Il ne doit donc être utilisé que lorsqu'une chaîne est passée à la fonction et doit inclure un domaine de texte. Votre dernier exemple en fait un mauvais usage.
Jacob Peattie
@JacobPeattie mon mauvais, je vais mettre à jour ... EDIT Fixed
jrmd