È la prova XSS del codice PHP?

4

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>";

?>
    
posta 27.11.2014 - 05:01
fonte

3 risposte

6

No, non lo è.

Prova a inserire javascript&colon;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>";

?>
    
risposta data 27.11.2014 - 05:03
fonte
17

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.

    
risposta data 27.11.2014 - 05:35
fonte
1

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 .

    
risposta data 28.11.2014 - 15:35
fonte

Leggi altre domande sui tag