Qual é a diferença entre esc_html, esc_attr, esc_html_e e assim por diante?

12

Eu recebi feedback do cara da segurança e ele apontou que eu deveria usar o escape adequado da entrada do usuário no meu código. Então, eu fiz algumas pesquisas e encontrei funções de escape.

Qual a diferença entre eles? Quando devo usar esc_html()e quando esc_attr()? E quando devo usar essas funções _e()no final?

baldrick
fonte
11
Você leu a documentação ?
Jacob Peattie
2
Sim e isso me confundiu ainda mais :(
baldrick

Respostas:

19

esc_html()escapa uma string para que não seja analisada como HTML. Caracteres como <são convertidos em &lt;, por exemplo. Isso parecerá o mesmo para o leitor, mas significa que, se o valor que está sendo produzido for <script>, ele não será interpretado pelo navegador como uma tag de script real.

Use esta função sempre que o valor que está sendo produzido não deva conter HTML.

esc_attr()escapa uma string para que seja seguro usá-lo em um atributo HTML, como class=""por exemplo. Isso evita que um valor se quebre do atributo HTML. Por exemplo, se o valor for "><script>alert();</script>e você tentar produzi-lo em um atributo HTML, ele fechará a tag HTML atual e abrirá uma tag de script. Isso não é seguro. Ao escapar do valor, não será possível fechar o atributo HTML, marcar e gerar HTML inseguro.

Use esta função ao gerar um valor dentro de um atributo HTML.

esc_url() escapa uma string para garantir que seja um URL válido.

Use esta função ao gerar um valor dentro de um atributo href=""ou src="".

esc_textarea()escapa um valor para que seja seguro usá-lo em um <textarea>elemento. Ao escapar de um valor com essa função, ele impede que um valor que está sendo produzido dentro <textarea<de a feche o <textarea>elemento e produza seu próprio HTML.

Use esta função ao gerar um valor dentro de um <textarea>elemento.

esc_html()e esc_attr()também tem versões terminadas em __(), _e()e _x(). Estes são para saída de strings traduzíveis.

WordPress tem funções, __(), _e()e _x(), para a saída de texto que pode ser traduzido. __() retorna uma sequência traduzível, _e() ecoa uma sequência traduzível e _x()retorna uma sequência traduzível com um determinado contexto. Você provavelmente já os viu antes.

Como você não pode necessariamente confiar que um arquivo de conversão contenha valores seguros, o uso dessas funções ao gerar uma sequência traduzível garante que as sequências que estão sendo produzidas não possam causar o mesmo problema descrito acima.

Use essas funções ao emitir strings traduzíveis.

Jacob Peattie
fonte
2
Note que, por padrão, não há nenhuma diferença entre esc_htmle esc_attr, o mesmo código é utilizado (eles só têm um filtro não utilizado diferente): wordpress.stackexchange.com/questions/264698/...
baptx
4

esc_htmlseria usado dentro do html, por exemplo, entre uma <p>tag

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

esc_attr seria usado para escapar dos valores de atributo nas tags html da seguinte forma:

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

aplicar _epara o final é para usá-lo com domínios de texto e ecoá-lo automaticamente para você, por exemplo:

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

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

Além de _e, também existe o __que faz o mesmo que _emas não o ecoa para que você possa armazená-lo em uma variável.

jrmd
fonte
2
_enão é apenas para ecoar, é para localização. Portanto, ele deve ser usado apenas quando uma string é passada para a função e deve incluir um domínio de texto. Seu último exemplo está fazendo mau uso.
Jacob Peattie
@JacobPeattie my bad, i update ... EDIT Fixed
jrmd