¿Está el siguiente código PHP a prueba de XSS?
<?php
$site = $_GET["url"];
echo "<a href='".str_replace(array("\"", "'", "javascript:", "vbscript:"), array("%22", "%27", "", ""), $site)."'>Site</a>";
?>
¿Está el siguiente código PHP a prueba de XSS?
<?php
$site = $_GET["url"];
echo "<a href='".str_replace(array("\"", "'", "javascript:", "vbscript:"), array("%22", "%27", "", ""), $site)."'>Site</a>";
?>
No, no lo es.
Intente insertar javascript:alert(9)
como la URL, o como @wireghoul señaló, JAVASCRIPT:alert(9)
. Incluso con javascript :alert(9)
en navegadores antiguos (IE < 8, supongo).
Mejor solución:
<?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>";
?>
Por lo general, soy un fanático de no volver a inventar la rueda porque la gente es más inteligente que nosotros. Hice una búsqueda rápida para usted y encontré la biblioteca actual que puede usar: enlace
Re: su código, parece un poco demasiado simple para evitarlo por completo. Usaría una solución estandarizada que es utilizada por otros y con la cual se contribuye continuamente a medida que se desarrollan nuevas vulnerabilidades.
Espero que ayude.
¡Hay un montón de tinta escrita sobre el tema de por qué no deberías intentar hacer tus propios filtros caseros para estas cosas! Consulte Pautas de mitigación de XSS de OWASP .
Utilice las bibliotecas adecuadas para estas cosas: OWASP ESAPI para PHP es una excelente herramienta para comenzar. con. También vería Purificador de HTML .