Disinfetta i tuoi input, sfuggendo ai caratteri speciali HTML. In PHP questo è fatto con htmlspecialcharacters . Assicurati di non fornire un flag che impedisca ai caratteri speciali html di sfuggire al tipo di preventivo che utilizzi.
Il tuo problema è che il tuo URL è http://example.com/?s=login&m=forgotten" onload=alert(966) bad="
, il tuo codice PHP che è probabilmente qualcosa del tipo:
<?php
$var = $_GET['m'];
echo '<a href="$var">something</a>';
ma su semplice sostituzione diretta con l'input non valido diventa:
<a href="forgotten" onload=alert(966) bad=">something</a>';
Il problema deriva dal "
senza caratteri di escape. La funzione PHP sanitizzante htmlspecialcharacters
cambierà la "
in una "
, quindi con:
<?php
$var = htmlspecialcharacters($_GET['m']);
echo '<a href="$var">something</a>';
l'HTML reso sarà:
<a href="forgotten" onload=alert(966) bad="">something</a>';
che il tuo browser interpreterà come un link gigante a forgotten" onload=alert(966) bad="
, invece di un tag html che contiene l'attributo onload
.
Personalmente, mi sposterei da PHP e ad un framework web che inizia con la sicurezza in mente; ad es., HTML esegue automaticamente l'escape di tutti gli input dal database e dai parametri di query nei modelli (a meno che non sia specificato diversamente), CSRF controlla per impostazione predefinita, utilizza parametri di query, ecc.