Răspunsul la problema de Luni - 11.Mar.2013
Deși variabila name
primită de la utilizator prin $_GET
sau $_POST
este filtrată, lipsa ghilimelelor de la atributul href
fac acest cod vulnerabil la un atac XSS.
Standardele susțin și obligă folosirea ghilimelelor la valoarea oricărui atribut HTML. Versiunea simplă a motivului este că ghilimelele au ca scop delimitarea valorilor și atunci când ele nu există, browser-ul nu știe unde începe și unde se termină valoarea aferentă unui anume atribut, iar drept urmare lucruri urâte se pot întâmpla.
Să luăm drept exemplu codul postat de mine anterior. Putem specifica un nume folosind $_GET
sau $_POST
; de dragul ușurinței, hai să folosim $_GET
:
// Accesăm:
http://domeniu.tld/test.php?name=alex
// link-ul generat o să arate așa:
<a href=test.php?name=alex>login</a>
Pare OK, nu ? Problema apare când începem să modificăm valoarea variabilei name
:
// Accesăm:
http://domeniu.tld/test.php?name=alex+onmouseover=alert(/bummer/)
// link-ul generat o să arate așa:
<a href=test.php?name=alex+onmouseover=alert(/bummer/)>login</a>
La prima vedere pare să funcționeze. Text-ul login
apare corect în pagină, acesta este un link, ceea ce și intenționam, dar dacă trecem cursorul peste link avem o surpriză.
Pentru a elimina problema XSS-ului nu este de ajuns să filtrăm orice date primim din surse nesigure ( _$_GET,