De ce ar trebui să folosesc esc_url?
Acest lucru îmi face programarea mai dificilă. Documentația WordPress explică folosirea esc_url vorbind vag despre securitate. Dar merită cu adevărat efortul?
De exemplu, care este beneficiul practic important în ceea ce privește securitatea atunci când folosim
<?php echo esc_url( home_url( '/' ) ); ?>
în loc de
<?php echo home_url() ?>
PS: Nu vorbesc despre dezvoltarea de teme, ci despre un site specific.

Dacă consultați documentația despre Validarea Datelor, aceasta menționează următoarele despre funcție:
Utilizați întotdeauna esc_url atunci când sanitizați URL-uri (în noduri de text, noduri de atribut sau oriunde altundeva). Respinge URL-urile care nu au unul dintre protocoalele permise [...], elimină caracterele invalide și elimină caracterele periculoase.
Aveți aici — un beneficiu practic de securitate. Protocol valid, fără caractere dubioase.
Răspunsul despre necesitate este categoric da. Escaparea output-ului este cea mai de bază practică de securitate.

Cu tot respectul, nu văd cum link-ul către pagina principală, de exemplu, poate reprezenta un risc de securitate. Poate aceste ghiduri sunt pentru crearea de teme și nu se aplică pentru codul "privat"? La urma urmei, poate fi mai bine să hardcodezi adresa paginii principale și alte link-uri în HTML și să nu folosești deloc PHP dacă există riscuri de securitate?

Este mult mai productiv să aplici practici de securitate în mod consecvent și universal, decât să deții dacă fiecare caz în parte merită. :)

Pe de altă parte, o resursă recomandată de Codex stabilește Regula nr. 3: Ai încredere în WordPress. Aceasta pare să recomande împotriva supra-sanitizării funcțiilor de bază ale WordPress, cum ar fi home_url()
, dacă sunt folosite în contextul lor potrivit. Conform acestei recomandări, m-am așteptat ca home_url
să efectueze propria sa sanitizare.

Scuze, sunt destul de nou în acest subiect, dar poate cineva să ofere un exemplu în care home_url() sau poate get_permalink() (unde, din câte știu, ar trebui folosit și esc_url()) returnează un URL invalid sau nesancționat (?) Nu vreau să fiu leneș sau încăpățânat, de aceea un exemplu m-ar putea ajuta să înțeleg utilizarea.

Alte lucruri importante de reținut despre
esc_url()
este că trebuie folosit pentru ceva de genul <a href="SANITIZE_THIS_URL">textul_tău</a>
. Dacă intenționezi să folosești URL-ul în output-ul HTML, cum ar fi un atribut href pentru un link sau un atribut src pentru un element imagine, ar trebui să folosești esc_url()
.
esc_url_raw()
este pentru alte cazuri în care dorești un URL curățat, dar nu vrei ca entitățile HTML să fie codate. Deci orice utilizare non-HTML (baze de date, redirectări) ar folosi această funcție.
Funcția esc_url_raw()
face practic același lucru ca esc_url()
, dar nu decodează entitățile, adică nu va înlocui & cu & și așa mai departe. După cum a menționat Mark, este sigur să folosești esc_url_raw()
în interogările de bază de date, redirectări și funcții HTTP, cum ar fi `wp_remote_get()'.
pentru mai multe informații despre esc_url_raw()

ei bine, toate datele introduse de utilizator ar trebui să fie sanitizate... Dacă URL-ul pe care îl injectezi nu este introdus de utilizator (de ex. setare de site de către cineva în care ai încredere deplină, valori hardcodate), atunci poți să te relaxezi în privința esc-url.
dar dacă aș putea injecta acel URL pe site-ul tău, aș putea injecta cu ușurință cod JS, sau cod de redirecționare... sau chiar cod pe partea de server în unele situații.
acest lucru poate duce la furt de sesiuni și la furtul conturilor utilizatorilor tăi, precum și la alte consecințe neplăcute.
Editare:
În exemplul tău esc_url( home_url( '/' ) );
a operat pe o valoare semi-hardcodată! prin urmare esc_url
poate fi eliminat.
Cu toate acestea, tot nu văd de ce să facem distincții între când există o amenințare și când nu și, în general, aș sugera să păstrăm esc_url() pentru fiecare valoare.

esc_url este folosită pentru a genera un HTML valid (nu pentru a curăța input-ul). Ar trebui să folosești această funcție ori de câte ori nu ești 100% sigur că ceea ce vrei să afișezi este un HTML valid pentru acel context.
