Pourquoi devrais-je utiliser l'esc_url?

12

Cette chose rend mon codage difficile. Le codex Wordpress motive l'utilisation de esc_url en parlant vaguement de sécurité. Mais vaut-il vraiment la peine?

Par exemple, quel est l'avantage de sécurité important et pratique que vous

<?php echo esc_url( home_url( '/' ) ); ?>

au lieu de

<?php echo home_url() ?>

PS: Je ne parle pas de développement de thème, mais d'un site spécifique.

IXN
la source

Réponses:

12

Si vous consultez la documentation sur la validation des données, elle contient les informations suivantes sur la fonction:

Utilisez toujours esc_url lors de la désinfection des URL (dans les nœuds de texte, les nœuds d'attribut ou ailleurs). Rejette les URL qui n'ont pas l'un des protocoles fournis sur liste blanche, [...] élimine les caractères invalides et supprime les caractères dangereux.

Voilà, c'est un avantage pratique pour la sécurité. Protocole valide, pas de caractères troubles.

La réponse à la nécessité est résolument oui . L'échappement de sortie est la pratique de sécurité la plus élémentaire.

Rarst
la source
2
Avec tout le respect que je vous dois, je ne vois pas comment le lien d'origine, par exemple, peut poser un risque pour la sécurité. Peut-être que ces directives concernent la création de thèmes et ne s'appliquent pas au code "privé"? Après tout, il peut être préférable de coder en dur l'adresse du domicile et d'autres liens en html et de ne pas utiliser du tout php s'il y a des risques de sécurité?
IXN
9
Il est beaucoup plus productif d'appliquer les pratiques de sécurité de manière cohérente et universelle que de débattre si chaque cas en vaut la peine. :)
Rarst
7
D'autre part, une ressource suggérée par le Codex établit la règle n ° 3: Trust WordPress . Cela semble déconseiller de suranalyser les fonctions de base de wp comme home_url(), si elles sont utilisées dans leur contexte approprié. Selon cette recommandation, je m'attendais home_urlà effectuer sa propre désinfection.
Franco
3

eh bien, toutes les entrées utilisateur doivent être nettoyées ... Si l'url que vous injectez n'est pas entrée par l'utilisateur (par exemple, la configuration du site par une personne de confiance, des valeurs codées en dur), vous pouvez vous soulager de l'esc-url.

mais si je pouvais injecter cette URL sur votre site, je pourrais facilement injecter du code js, ou du code de redirection ... ou même du code côté serveur dans certaines situations.

cela peut entraîner le détournement de session et le vol de vos comptes d'utilisateurs et d'autres mauvaises options.

Éditer:

Dans votre exemple, esc_url( home_url( '/' ) );
il fonctionnait sur une valeur semi-codée en dur! esc_urlpeut donc être éliminé.
Cela dit, je ne vois toujours pas pourquoi se soucier des distinctions entre quand il y a une menace et quand il n'y en a pas et suggérerais généralement de garder esc_url () pour chaque valeur.

Tomer W
la source
3
"La configuration du site par quelqu'un en qui vous avez confiance" est toujours littéralement entrée par l'utilisateur. :)
Rarst
@Rarst ouais, je suis avec toi, mais il était tellement "dégoûté" en utilisant esc_url, j'ai été un peu plus indulgent.
Tomer W
2

Vous devez également garder à l'esprit esc_url()quelque chose comme <a href="SANITIZE_THIS_URL">your_text</a>.si vous allez utiliser l'URL dans votre sortie HTML, comme un attribut href pour un lien ou un attribut src pour un élément image, vous devez utiliser esc_url().

esc_url_raw()est pour d'autres cas où vous voulez une URL propre, mais vous ne voulez pas que les entités HTML soient encodées. Donc, toute utilisation non HTML (DB, redirection) utiliserait cela.

La esc_url_raw()fonction fera à peu près la même chose que esc_url(), mais elle ne décodera pas les entités, ce qui signifie qu'elle ne remplacera pas & par & # 038 et ainsi de suite. Comme Mark l'a souligné, il est sûr d'utiliser esc_url_raw()dans les requêtes de base de données, les redirections et les fonctions HTTP, telles que `wp_remote_get () 'pour plus d'informations sur esc_url_raw ()

MD MUSA
la source
1

esc_url est utilisé pour produire un code HTML valide (pas pour filtrer l'entrée). Vous devez l'utiliser à chaque fois que vous n'êtes pas sûr à 100% que ce que vous souhaitez générer est un code HTML valide pour ce contexte.

Matthieu
la source
Toutes les familles de fonctions d'échappement sont explicitement destinées à la désinfection.
Rarst le