Diferença entre esc_url () e esc_url_raw ()

9

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

Estou confuso sobre quando um deles deve ser usado.

Supondo que eu tenho este URL:, http://site.com/?getsomejavascript=1que é gerado dinamicamente javascript:

  • se eu incluir o script esc_url(add_query_arg('apples', 420)), eu recebo http://site.com/?getsomejavascript=1&apples=420e ele quebra por causa dessas #038;referências

  • se eu usar esc_url_raw(add_query_arg('apples', 420)), recebo o URL correto:http://site.com/?getsomejavascript=1&apples=420

mas na documentação descubro que esc_url_raw deve ser usado apenas para escapar de URLs inseridos no banco de dados ...

onetrickpony
fonte

Respostas:

10

Na entrada Codex para Validação de Dados: URLs :

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

Sempre use esc_url ao limpar URLs (em nós de texto, nós de atributo ou em qualquer outro lugar). Rejeita URLs que não possuem um dos protocolos fornecidos na lista de permissões (por padrão, http, https, ftp, ftps, mailto, news, irc, gopher, nntp, feed e telnet), elimina caracteres inválidos e remove caracteres perigosos. Descontinuado desde 3.0: clean_url () Esta função codifica caracteres como entidades HTML: use-o ao gerar um documento (X) HTML ou XML. Codifica e comercial (&) e aspas simples (') como referências numéricas de entidade (&,').

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

Para inserir um URL no banco de dados. Essa função não codifica caracteres como entidades HTML: use-a ao armazenar uma URL ou em outros casos em que você precise da URL não codificada. Essa funcionalidade pode ser replicada na função clean_url antiga, definindo $ context para db.

Portanto, as principais diferenças parecem ser:

  1. esc_url()codifica entidades HTML, enquanto esc_url_raw()não
  2. esc_url()destina-se à saída , enquanto esc_url_raw()destina-se ao armazenamento de banco de dados

EDITAR:

Como você está codificando (ou salvando / armazenando separadamente) o URL real da string de consulta e depois anexando a string de consulta [add_query_arg()][2], pode ser melhor escapar dessa string de consulta anexada em esc_js()vez de esc_url()?

Por exemplo:

add_query_arg( esc_js( 'apples' ), esc_js( '420' ), $myurl )
Chip Bennett
fonte
2
ok, mas a esc_url()não funcionar corretamente quando você tem consulta argumentos em uma URL que você wanto para a saída
onetrickpony
Que tal usar esc_js()para escapar apenas dos dados adicionados via add_query_arg()? Veja editar na resposta acima.
Chip Bennett
Eu não tentei, mas isso não faz sentido :) tanto esc_js ('maçãs') quanto 'maçãs' retornarão apples. O problema está em add_query_arg quando une 'maçãs' com outros argumentos com&
onetrickpony 31/03
Então, se os dados são confiáveis ​​(estáticos), por que escapar?
Chip Bennett
Não tenho certeza absoluta de que é seguro não escapar disso. Estou basicamente incluindo scripts usando algo como<script type="text/javascript" src="<?= $_SERVER['REQUEST_URI'] ?>'/?javascriptcode=1"></script>
onetrickpony 31/03