Sanitizarea parametrilor URL din get_query_var()
În prezent lucrez la un site și testez securitatea acestuia. Una dintre pagini are o funcționalitate de sortare unde transmit un parametru URL care indică modul de sortare a conținutului.
De exemplu:
www.example.com/page/?sort=alpha
Aceasta funcționează corect, dar am încercat să trimit și cod rău intenționat:
www.example.com/page/?sort=alpha%3Cimg+src=xyz+onerror=alert(99)%3E%3Cxss/%3E
În Internet Explorer când introduc acest URL, pagina mea se afișează și apare o alertă JavaScript, astfel am reușit să execut cod pe pagină. În Chrome primesc mesajul că auditorul XSS a blocat această execuție, dar aș prefera ca nici să nu fie încercată rularea. Din câte văd, acest parametru este acceptat în fișierul meu header.php
sub forma Sort : <?= get_query_var('sort') ?>
.
Doresc să sanitizez această intrare astfel încât să nu execute niciodată un astfel de script. Cum pot face acest lucru?

Există o ușoară neconcordanță între titlul întrebării și întrebarea propriu-zisă.
Se pare că utilizați un plugin (sau dezvoltați un plugin?) care permite o anumită sortare pe partea de front-end. Dacă este un plugin pe care îl utilizați și parametrul din șirul de interogare nu este curățat, trebuie să notificați dezvoltatorul acelui plugin, deoarece aceasta este o problemă de securitate.
Remedierea problemei singur ar putea rezolva problema - temporar, dar nu ar trebui să editați direct pluginurile (chiar și cele prost codate), deoarece aceasta vă plasează într-o poziție delicată, obligându-vă să reaplicați modificările la fiecare actualizare a pluginului.
Numele funcției get_query_var()
poate fi derutant. Mulți oameni o consideră un înlocuitor WordPress pentru $_GET[]
, dar aceasta nu este funcția ei. get_query_var()
este DOAR pentru variabilele care sunt setate ca parte a interogării globale WordPress. Aceasta include o serie de valori implicite WordPress, împreună cu orice variabile personalizate (adăugate cu set_query_var()
).
Un plugin care aplică o rescriere personalizată a URL-urilor pentru punctele sale finale ar putea fi un exemplu în acest sens. Dar dacă credeți că o puteți folosi pentru a prelua orice variabilă de interogare din URL, aceasta nu va funcționa deoarece nu este rolul get_query_var()
.
Trebuie doar să căutați locul în care acest argument de interogare este colectat. Cel mai probabil, acest lucru se face folosind $_GET['sort']
.
Orice ar fi acesta, ar trebui să fie:
$some_var = sanitize_text_field( $_GET['sort'] );
Sau chiar mai bine:
$some_var = ( isset( $_GET['sort'] ) ) ? sanitize_text_field( $_GET['sort'] ) : 'valoare implicită';
Evident, răspund pe baza unor presupuneri, ale căror detalii nu au fost incluse în întrebarea dumneavoastră. Dacă am greșit, actualizați întrebarea cu mai multe informații și voi edita în consecință.
