Care este diferența dintre esc_html, esc_attr, esc_html_e și altele?

7 dec. 2018, 17:59:49
Vizualizări: 33.7K
Voturi: 23

Am primit feedback de la specialistul în securitate care mi-a subliniat că ar trebui să folosesc escaparea corectă a datelor introduse de utilizator în codul meu. Așa că am făcut câteva cercetări și am găsit funcțiile de escapare.

Care este diferența dintre acestea? Când ar trebui să folosesc esc_html() și când esc_attr()? Și când ar trebui să folosesc aceste funcții cu _e() la sfârșit?

2
Comentarii

Ai citit documentația?

Jacob Peattie Jacob Peattie
7 dec. 2018 18:06:35

Da și asta m-a încurcat și mai tare :(

baldrick baldrick
7 dec. 2018 18:10:46
Toate răspunsurile la întrebare 2
1
49

esc_html() escapă un șir de caractere astfel încât să nu fie interpretat ca HTML. Caractere precum < sunt convertite în &lt;, de exemplu. Acest lucru va arăta la fel pentru cititor, dar înseamnă că dacă valoarea afișată este <script>, atunci nu va fi interpretată de browser ca un tag de script real.

Folosiți această funcție ori de câte ori valoarea afișată nu ar trebui să conțină HTML.

esc_attr() escapă un șir de caractere astfel încât să fie sigur pentru utilizarea într-un atribut HTML, cum ar fi class="", de exemplu. Acest lucru previne ca o valoare să iasă din atributul HTML. De exemplu, dacă valoarea este "><script>alert();</script> și ați încerca să o afișați într-un atribut HTML, aceasta ar închide tag-ul HTML curent și ar deschide un tag de script. Acest lucru este nesigur. Prin escaparea valorii, aceasta nu va putea închide atributul HTML și tag-ul și nu va afișa HTML nesigur.

Folosiți această funcție atunci când afișați o valoare în interiorul unui atribut HTML.

esc_url() escapă un șir de caractere pentru a se asigura că acesta este un URL valid.

Folosiți această funcție atunci când afișați o valoare în interiorul unui atribut href="" sau src="".

esc_textarea() escapă o valoare astfel încât să fie sigură pentru utilizarea într-un element <textarea>. Prin escaparea unei valori cu această funcție, se previne ca o valoare afișată în interiorul unui <textarea> să închidă elementul <textarea> și să afișeze propriul HTML.

Folosiți această funcție atunci când afișați o valoare în interiorul unui element <textarea>.

esc_html() și esc_attr() au și versiuni care se termină cu __(), _e() și _x(). Acestea sunt pentru afișarea șirurilor de caractere traductibile.

WordPress are funcții, __(), _e() și _x(), pentru afișarea textului care poate fi tradus. __() returnează un șir de caractere traductibil, _e() afișează un șir de caractere traductibil, iar _x() returnează un șir de caractere traductibil cu un context dat. Probabil le-ați văzut deja.

Deoarece nu puteți avea încredere că un fișier de traducere conține valori sigure, utilizarea acestor funcții atunci când afișați un șir de caractere traductibil asigură că șirurile afișate nu pot provoca aceleași probleme descrise mai sus.

Folosiți aceste funcții atunci când afișați șiruri de caractere traductibile.

7 dec. 2018 18:28:01
Comentarii

Rețineți că implicit, nu există nicio diferență între esc_html și esc_attr, se folosește același cod (doar au un filtru neutilizat diferit): https://wordpress.stackexchange.com/questions/264698/what-is-the-difference-between-esc-html-filter-vs-attribute-escape-filter/264707#264707

baptx baptx
20 iul. 2019 13:11:42
2
10

esc_html ar fi folosit în interiorul HTML, de exemplu între un tag <p>

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

esc_attr ar fi folosit pentru escaparea valorilor atributelor în tag-urile HTML, astfel:

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

Aplicarea sufixului _e este pentru utilizarea cu domenii de text și va afișa automat rezultatul, de exemplu:

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

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

Pe lângă _e, există și __ care face același lucru ca _e, dar nu afișează rezultatul, astfel încât îl poți stoca într-o variabilă.

7 dec. 2018 18:04:13
Comentarii

_e nu este doar pentru afișare, ci pentru localizare. Deci ar trebui folosit doar când un șir de caractere este transmis funcției și ar trebui să includă un domeniu de text. Ultimul tău exemplu îl folosește incorect.

Jacob Peattie Jacob Peattie
7 dec. 2018 18:12:24

@JacobPeattie greșeala mea, voi actualiza... EDIT Rezolvat

jrmd jrmd
7 dec. 2018 18:23:18