Il seguente codice PHP XSS è in prova?
<?php
$site = $_GET["url"];
echo "<a href='".str_replace(array("\"", "'", "javascript:", "vbscript:"), array("%22", "%27", "", ""), $site)."'>Site</a>";
?>
Il seguente codice PHP XSS è in prova?
<?php
$site = $_GET["url"];
echo "<a href='".str_replace(array("\"", "'", "javascript:", "vbscript:"), array("%22", "%27", "", ""), $site)."'>Site</a>";
?>
No, non lo è.
Prova a inserire javascript:alert(9)
come URL o, come indicato da @wireghoul, JAVASCRIPT:alert(9)
. Anche con javascript :alert(9)
nei browser più vecchi (IE < 8, credo).
Soluzione migliore:
<?php
header('Content-Type: text/html; charset=utf-8');
header('X-Content-Type-Options: nosniff');
$site = $_GET["url"];
$site_lowercase = strtolower($site);
if(strpos($site_lowercase, "http://")===0 || strpos($site_lowercase, "https://")===0){
$possible_xss = false;
}
else if(strpos($site_lowercase, "ftp://")===0 || strpos($site_lowercase, "ftps://")===0){
$possible_xss = false;
}
else if(strpos($site, "/")===0){
$possible_xss = false;
}
else{
$possible_xss = true;
}
$site = str_replace(array("\"", "'"), array("%22", "%27"), $site);
echo "<a href='".(($possible_xss)?"//".$site:$site)."'>Site</a>";
?>
In genere sono un fan del non inventare la ruota perché le persone sono molto più intelligenti di noi. Ho effettuato una rapida ricerca per te e ho trovato la libreria corrente che puoi utilizzare: link
Ri: il tuo codice, sembra un po 'troppo semplice per impedirlo completamente. Vorrei utilizzare una soluzione standardizzata che viene utilizzata da altri e che ha continuamente contribuito a sviluppare nuovi exploit.
Spero che ti aiuti.
C'è un sacco di inchiostro scritto sul tema del perché non dovresti provare a fare i tuoi filtri homebrew per queste cose! Si prega di dare un'occhiata a alle linee guida per la mitigazione XSS di OWASP .
Utilizza le librerie appropriate per queste cose: OWASP ESAPI per PHP è un ottimo strumento per iniziare con. Guarderei anche HTML Purifier .