¿Es este código PHP a prueba de XSS?

4

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

?>
    
pregunta 27.11.2014 - 05:01
fuente

3 respuestas

6

No, no lo es.

Intente insertar javascript&colon;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>";

?>
    
respondido por el Lucas NN 27.11.2014 - 05:03
fuente
17

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.

    
respondido por el Pim de Witte 27.11.2014 - 05:35
fuente
1

¡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 .

    
respondido por el Milen 28.11.2014 - 15:35
fuente

Lea otras preguntas en las etiquetas