Différence entre esc_url () et esc_url_raw ()

9

http://core.trac.wordpress.org/browser/trunk/wp-includes/formatting.php#L2239

Je ne sais pas quand utiliser l'un ou l'autre.

En supposant que j'ai cette URL:, http://site.com/?getsomejavascript=1qui est généré dynamiquement javascript:

  • si j'inclus le script avec esc_url(add_query_arg('apples', 420)), j'obtiens http://site.com/?getsomejavascript=1&apples=420et ça casse à cause de ces #038;références

  • si j'utilise esc_url_raw(add_query_arg('apples', 420))j'obtiens l'URL correcte:http://site.com/?getsomejavascript=1&apples=420

mais dans la documentation, je découvre que esc_url_raw ne doit être utilisé que pour échapper les URL insérées dans la base de données ...

onetrickpony
la source

Réponses:

10

À partir de l' entrée Codex pour la validation des données: URL :

esc_url( $url, (array) $protocols = null ) (depuis 2.8)

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 la liste blanche (par défaut http, https, ftp, ftps, mailto, news, irc, gopher, nntp, feed et telnet), élimine les caractères invalides et supprime les caractères dangereux. Déconseillé depuis 3.0: clean_url () Cette fonction code les caractères sous forme d'entités HTML: utilisez-la lors de la génération d'un document (X) HTML ou XML. Encode les esperluettes (&) et les guillemets simples (') comme références d'entité numérique (&,').

esc_url_raw( $url, (array) $protocols = null ) (depuis 2.8)

Pour insérer une URL dans la base de données. Cette fonction ne code pas les caractères en tant qu'entités HTML: utilisez-la lors du stockage d'une URL ou dans d'autres cas où vous avez besoin de l'URL non codée. Cette fonctionnalité peut être répliquée dans l'ancienne fonction clean_url en définissant $ context sur db.

Ainsi, les principales différences semblent être:

  1. esc_url()code les entités HTML, mais esc_url_raw()ne
  2. esc_url()est destiné à la sortie , tandis qu'il esc_url_raw()est destiné au stockage de la base de données

ÉDITER:

Étant donné que vous codez en dur (ou enregistrez / stockez séparément) l'URL réelle de la chaîne de requête, puis que vous ajoutez la chaîne de requête via [add_query_arg()][2], est-il préférable d'échapper à votre chaîne de requête ajoutée via esc_js(), plutôt que esc_url()?

Par exemple:

add_query_arg( esc_js( 'apples' ), esc_js( '420' ), $myurl )
Chip Bennett
la source
2
ok, mais le esc_url()ne fonctionne pas correctement lorsque vous avez des arguments de requête dans une URL que vous souhaitez afficher
onetrickpony
Qu'en est-il de l'utilisation esc_js()pour échapper uniquement aux données ajoutées via add_query_arg()? Voir modifier en réponse, ci-dessus.
Chip Bennett
Je ne l'ai pas essayé, mais cela n'a pas de sens :) esc_js ('apples') ou 'apples' reviendront apples. Le problème est dans add_query_arg lorsque joint des 'pommes' avec d'autres arguments avec&
onetrickpony
Ensuite, si les données sont fiables (c'est-à-dire statiques), pourquoi s'échapper du tout?
Chip Bennett
Je ne suis pas sûr qu'il soit sûr de ne pas y échapper. <script type="text/javascript" src="<?= $_SERVER['REQUEST_URI'] ?>'/?javascriptcode=1"></script>
J'inclus