web-dev-qa-db-fra.com

Est-ce une utilisation correcte de esc_html_e?

<h1 class="page-title"><?php esc_html_e( 'Oops! Something went wrong.', '_amnth' ); ?></h1>

Je pense que cela devrait simplement utiliser la fonction __(), puisqu'il s'agit d'une chaîne statique et qu'il ne peut pas être dynamique et, au contraire, HTML.

En même temps, voici un code source de WooCommerce lui-même:

<th class="product-name"><?php esc_html_e( 'Product', 'woocommerce' ); ?></th>

Donc, est-ce que chaque fois que vous exportez une chaîne, dynamique ou non, en HTML, vous devez également l'échapper avec esc_html et ainsi, même s'il ne s'agit que d'une chaîne en cours de sortie, vous devez utiliser esc_html_e?

S'il vous plaît assumer des règles d'échappement extrêmement strictes, où tout doit être échappé de la bonne façon. (Même dans ce cas, utiliser esc_html_e semble excessif à la puissance de 10).

1
coolpasta

Vous devriez toujours échapper à la sortie. fin de la phrase et fin de l'histoire.

Les questions sont comme demander si vous pouvez utiliser globals et goto. Bien sûr, ils font partie du langage et dans certains cas Edge, ils sont le seul moyen de produire du code fonctionnel et lisible, mais le guide est de ne jamais les utiliser à moins que vous ne puissiez prouver que vous l'avez également.

En passant de la théorie à la pratique, il n'est pas vrai que __ est une chaîne statique, comme si elle était statique, vous ne l'auriez pas utilisée du tout et que vous utilisiez simplement la chaîne littérale. Il est encore pire, car la fonction est signifiait pour fournir un moyen simple de remplacer une chaîne par une autre chaîne, une chaîne dont vous ne savez peut-être pas le contenu.

Lorsque vous tentez d'ajouter des balises html à la chaîne dans le cadre de la traduction, le seul endroit où vous pourriez vous retrouver avec un résultat incorrect au premier plan est le cas. Toutefois, il s'agit d'un cas extrêmement rare, surtout si vous avez pensé aux traducteurs lors de la création de code. cela fait la sortie.

À la suite de la discussion dans les commentaires, j’ai le sentiment que je devrais peut-être énoncer le raisonnement d’une manière différente. Les traductions doivent être traitées comme une entrée utilisateur, car les utilisateurs peuvent réellement les modifier ou utiliser un plugin pour les modifier. Et toutes les entrées utilisateur doivent être suspectes, sinon pour des raisons de sécurité, mais pour des raisons html cassées. Elles doivent donc être validées, désinfectées et échappées.

Avec une entrée utilisateur plus traditionnelle, vous pouvez parfois éviter de vous échapper en effectuant une validation et un assainissement plus rigoureux, mais vous n’avez aucune chance de le faire en ce qui concerne la traduction, et l’évasion est votre quasi-seul outil pour vous protéger contre les failles de sécurité. HTML cassé.

3
Mark Kaplun

Votre argument semble être que "Produit" sera toujours "Produit". Comme d'autres l'ont fait remarquer, ce n'est pas le cas car (1) il est possible d'imprimer une traduction et (2) il peut être modifié par des filtres dans votre thème ou par tout plug-in que vous avez installé.

Sur le premier point: le contenu du traducteur ne doit pas être considéré comme fiable (à mon avis) et vous devez donc TOUJOURS (si possible *) échapper à toute chaîne localisée. Même si vous faites confiance à vos traducteurs personnellement, ils peuvent entrer innocemment un texte qui casserait votre page Web s'il n'était pas échappé.

Donc, à votre question initiale "Est-ce une utilisation correcte de esc_html_e?"

_ {Oui, c'est absolument correct pour vos deux exemples.} _

Si vous craignez vraiment que esc_html ne soit excessif (supposez-vous que la performance vous préoccupe), vous devriez au moins utiliser la fonction native htmlspecialchars de PHP . Je vais probablement me lyncher pour avoir suggéré cela, parce que ce n'est pas la meilleure pratique du point de vue de WordPress. (vous manquerez d'autres filtres et vérifications du jeu de caractères).


* Il y a un autre cas à discuter ici:

Si la traduction est destinée à contenir HTML , comme cet exemple , vous verrez souvent des auteurs imprimer des chaînes non échappées. Idéalement, le code HTML non approuvé doit être nettoyé avant l'impression, mais même le noyau WordPress ne le fait pas.

Assainir le code HTML entraîne une charge plus importante que simplement l’échapper, ce qui explique peut-être pourquoi même WordPress a des exemples de traductions HTML non échappées. Voici un sur dix-sept . Vraisemblablement, la requête de recherche fournie par l'utilisateur dans %s a été nettoyée, mais la traduction ne l'a pas été. Ouvrez votre éditeur de PO préféré et entrez une traduction comme celle-ci:

#: search.php:19
msgid "Search Results for: %s"
msgstr "Oh dear <script>alert(\"HACKED\")</script>"

Voila. Script injecté dans la page de résultats de recherche. L'essayer Cela fonctionne réellement à vingt-sept.

Nous pouvons discuter toute la journée pour savoir s’il faut faire confiance au contenu du traducteur. Je dirais que ce n'est pas. Un "<" égaré mais parfaitement innocent pourrait casser votre page.

2
Tim

Cela dépend ... Comme dans presque tous les cas ...

Donc, est-ce que chaque fois que vous exportez une chaîne, dynamique ou non, en HTML, vous devriez également l'échapper avec esc_html et que, même si c'est simplement une chaîne en cours de sortie, vous devriez utiliser esc_html_e?

Oui et non. Si vous souhaitez autoriser l'affichage du code HTML, vous ne devez pas y échapper. Mais si vous voulez être plus en sécurité et être certain qu'aucun HTML ne sera affiché, alors oui, vous pouvez utiliser l'échappement.

Cette "chaîne statique" est traduite, elle n’est donc plus statique. Les traducteurs peuvent mettre n'importe quoi comme traduction. Et même pire - vous pouvez utiliser gettext filter pour le modifier, afin que non seulement les traducteurs, mais également tout plugin ou thème puisse modifier ce texte ...

Ce n'est pas si important avec esc_html, mais ça commence à l'être quand vous jetez un coup d'oeil à esc_attr - les traducteurs peuvent facilement casser votre site en mettant des caractères incorrects dans une chaîne imprimée en tant qu'attribut HTML.

1