Qual è la differenza tra esc_html, esc_attr, esc_html_e e simili?

7 dic 2018, 17:59:49
Visualizzazioni: 33.7K
Voti: 23

Ho ricevuto un feedback da un esperto di sicurezza che mi ha fatto notare che dovrei utilizzare un appropriato escape dell'input utente nel mio codice. Così ho fatto alcune ricerche e ho trovato le funzioni di escape.

Qual è la differenza tra queste funzioni? Quando dovrei usare esc_html() e quando esc_attr()? E quando dovrei usare queste funzioni con _e() alla fine?

2
Commenti

Hai letto la documentazione?

Jacob Peattie Jacob Peattie
7 dic 2018 18:06:35

Sì e mi ha confuso ancora di più :(

baldrick baldrick
7 dic 2018 18:10:46
Tutte le risposte alla domanda 2
1
49

esc_html() codifica una stringa in modo che non venga interpretata come HTML. Caratteri come < vengono convertiti in &lt;, ad esempio. Questo apparirà uguale al lettore, ma significa che se il valore da visualizzare è <script> non verrà interpretato dal browser come un tag script reale.

Usa questa funzione ogni volta che il valore da visualizzare non dovrebbe contenere HTML.

esc_attr() codifica una stringa in modo che sia sicura da utilizzare in un attributo HTML, come class="" ad esempio. Questo impedisce a un valore di uscire dall'attributo HTML. Ad esempio, se il valore è "><script>alert();</script> e provi a visualizzarlo in un attributo HTML, chiuderebbe il tag HTML corrente e aprirebbe un tag script. Questo è pericoloso. Codificando il valore, non sarà in grado di chiudere l'attributo e il tag HTML e visualizzare codice HTML non sicuro.

Usa questa funzione quando visualizzi un valore all'interno di un attributo HTML.

esc_url() codifica una stringa per assicurarsi che sia un URL valido.

Usa questa funzione quando visualizzi un valore all'interno di un attributo href="" o src="".

esc_textarea() codifica un valore in modo che sia sicuro da utilizzare in un elemento <textarea>. Codificando un valore con questa funzione si impedisce che un valore visualizzato all'interno di un <textarea> chiuda l'elemento <textarea> e visualizzi il proprio HTML.

Usa questa funzione quando visualizzi un valore all'interno di un elemento <textarea>.

esc_html() e esc_attr() hanno anche versioni che terminano con __(), _e() e _x(). Queste servono per visualizzare stringhe traducibili.

WordPress ha le funzioni __(), _e() e _x() per visualizzare testo che può essere tradotto. __() restituisce una stringa traducibile, _e() stampa una stringa traducibile e _x() restituisce una stringa traducibile con un contesto specificato. Probabilmente le hai già viste.

Poiché non puoi necessariamente fidarti che un file di traduzione contenga valori sicuri, utilizzare queste funzioni quando visualizzi una stringa traducibile assicura che le stringhe visualizzate non possano causare i problemi descritti sopra.

Usa queste funzioni quando visualizzi stringhe traducibili.

7 dic 2018 18:28:01
Commenti

Nota che per impostazione predefinita, non c'è differenza tra esc_html e esc_attr, viene utilizzato lo stesso codice (hanno solo un filtro non utilizzato diverso): https://wordpress.stackexchange.com/questions/264698/what-is-the-difference-between-esc-html-filter-vs-attribute-escape-filter/264707#264707

baptx baptx
20 lug 2019 13:11:42
2
10

esc_html verrebbe utilizzato all'interno dell'HTML, ad esempio tra un tag <p>

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

esc_attr verrebbe utilizzato per l'escape dei valori degli attributi nei tag HTML in questo modo:

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

Aggiungere _e alla fine serve per utilizzarlo con i domini di testo e lo stamperà automaticamente per te, ad esempio:

<p><?php esc_html_e( 'testo-qualsiasi', 'dominio-testo' ); ?></p>

<p my-attribute="<?php esc_attr_e( 'testo-qualsiasi', 'dominio-testo' ); ?>"></p>

Oltre a _e esiste anche __ che fa la stessa cosa di _e ma non lo stampa, quindi puoi memorizzarlo in una variabile.

7 dic 2018 18:04:13
Commenti

_e non serve solo per visualizzare, ma per la localizzazione. Quindi dovrebbe essere utilizzato solo quando una stringa viene passata alla funzione e dovrebbe includere un dominio di testo. Il tuo ultimo esempio ne fa un uso errato.

Jacob Peattie Jacob Peattie
7 dic 2018 18:12:24

@JacobPeattie mio errore, aggiornerò... MODIFICA Corretto

jrmd jrmd
7 dic 2018 18:23:18