Sanitizarea parametrilor URL din get_query_var()

26 oct. 2019, 11:45:10
Vizualizări: 13.9K
Voturi: 5

Î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?

1
Comentarii

Sortarea sună ca un plugin pe care îl folosești? Dacă da, cel mai bun mod de a gestiona situația este să anunți dezvoltatorul că ai descoperit o vulnerabilitate și că aceasta trebuie remediată.

butlerblog butlerblog
27 oct. 2019 01:59:40
Toate răspunsurile la întrebare 1
2

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ță.

27 oct. 2019 20:41:58
Comentarii

Mulțumesc mult, funcționează!

user2924127 user2924127
28 oct. 2019 00:12:40

Mă bucur că a funcționat pentru tine. Doar pentru a sublinia, dacă această problemă este într-un plugin pe care îl folosești, anunță dezvoltatorul acestuia pentru a remedia vulnerabilitatea.

butlerblog butlerblog
28 oct. 2019 23:46:46