No conozco ningún navegador que ejecute Javascript para el ejemplo particular que mencionas. Considero altamente improbable que cualquier navegador ejecute Javascript en esta situación. Esto no está relacionado con las nuevas protecciones en los navegadores modernos.
Sin embargo , sospecho que todavía eres vulnerable. Si un atacante puede insertar marcas en un atributo href, probablemente significa que pueden insertar lo que quieran. Y si un atacante puede insertar lo que quiera, entonces suceden cosas malas. Por ejemplo, el atacante puede hacer que se vea así:
<a href="javascript:alert(8007)">Click me</a>
Y eso es una mala noticia, porque los navegadores ejecutarán Javascript en esa situación. Así que esta es una forma en que un atacante podría intentar explotar la vulnerabilidad XSS.
Además, si no hay comillas alrededor del valor del parámetro href, habrá otras formas de atacar su sistema. Por ejemplo, <a href=blah onclick=alert(8007)>Click me</a>
es una mala noticia y ejecutará Javascript. (Gracias a @AviD por señalar esto). Incluso si hay are comillas alrededor del valor del parámetro href, si el atacante controla completamente el valor colocado allí, el atacante podrá proporcionar su propias citas para romper el atributo y luego causar problemas, como esto: <a href="blah" onclick=alert(8007) ignoreme="blah">Click me</a>
. (Aquí el atacante insertó el valor blah" onclick=alert(8007) ignoreme="blah
). Probablemente hay más ejemplos como este.
El resultado final. Definitivamente, recomiendo que corrijas la vulnerabilidad de XSS. Sospecho que usted está en riesgo. Los chicos malos han desarrollado una gran cantidad de formas sorprendentes e inteligentes de explotar las vulnerabilidades de XSS que no se puede esperar que conozcan; como resultado, si tiene una vulnerabilidad XSS, su mejor opción es solucionarla de manera preventiva y no arriesgarse.
Corrección de la falla. Para corregir la falla, te recomiendo que uses una combinación de validación y escape de salida. Primero, asegúrese de que el controlador de protocolo de la URL sea uno de un conjunto en lista blanca (por ejemplo, http
, https
, ftp
, mailto
). Luego, aplique HTML escaping para escapar de todos los corchetes angulares, comillas y símbolos & antes de insertar la URL en el marcado, y asegúrese de que el valor del atributo esté rodeado de comillas.
La forma exacta de implementar esta solución depende del idioma, pero puede encontrar mucha información en la web sobre cómo evitar fallas de XSS en esta situación. Por ejemplo, después de asegurarse de que el valor dinámico contenga un protocolo seguro, en PHP podría usar htmlspecialchars(., ENT_QUOTES)
para escapar de paréntesis, comillas y símbolos. O puede usar OWASP ESAPI , que proporciona ayuda para esta situación exactamente .
Para obtener más información, puedo recomendar Una buena introducción para desarrolladores web . Esto es solo una introducción y necesitará leer más, pero le ayudará a estar al tanto de las amenazas a un alto nivel. OWASP tiene algunos buenos recursos para defenderse contra XSS; por ejemplo, tienen una cheatsheet útil sobre cómo usar OWASP ESPI para evitar las vulnerabilidades de XSS .