¿Es suficiente para convertir ', y para evitar XSS en cadenas de JavaScript?

8

¿Es suficiente convertir ' en &#039; , > en &gt; y < en &lt; para evitar XSS cuando se insertan datos no confiables en una cadena de JavaScript como abajo?

<script>
param='payload';
</script>

¿Hay ejemplos de situaciones en las que la conversión anterior no sea suficiente para evitar XSS?

    
pregunta Sanchit Sharma 27.11.2014 - 14:19
fuente

2 respuestas

9

No confíe en usar sus propias reglas de "conversión", OWASP recomienda usar una biblioteca de codificación centrada en la seguridad para garantizar que las reglas necesarias se implementen correctamente:

  

Escape de los siguientes caracteres con la codificación de entidad HTML para evitar cambiar a cualquier contexto de ejecución, como script, estilo o controladores de eventos. Además de los 5 caracteres significativos en XML (& amp ;, & lt ;, & gt ;, ", '), la barra diagonal se incluye ya que ayuda a finalizar una entidad HTML.

     

La codificación de entidad HTML está bien para los datos que no son de confianza que colocó en el cuerpo del documento HTML, como dentro de una etiqueta <div> . Sin embargo, no sería suficiente en varios casos, como "contextos anidados":

<script>...param used directly here...</script>
<!--...param used inside an HTML comment...-->
<div ...param used in an attribute name=test />
<param as a tag name href="/test" />
<style>...param used directly in CSS...</style>
     

En general, nunca use param dentro de ninguna de estas entidades anidadas, incluso si la entidad HTML está codificada.

    
respondido por el Milen 27.11.2014 - 15:12
fuente
5

No es suficiente, no. Ejemplo de barra invertida:

<script>
var param1 = '{{ param1 }}'; var param2 = '{{ param2 }}';
</script>
param1=\&param2=;alert(1)//
<script>
var param1 = '\'; var param2 = ';alert(1)//';
</script>

Sin mencionar que sus datos no sobrevivirán intactos:

<script>
var param1 = '&lt;';
alert(param1); // Shows up as &lt;, not <
</script>

Las líneas nuevas ( \r , \n , \u2028 , \u2029 ) también pueden romper una cadena de JavaScript, aunque probablemente sea raro que eso cree una vulnerabilidad, ya que es invariablemente un error de sintaxis. Si absolutamente necesita poner la entrada del usuario en una variable en una línea inline <script> inline, recomendaría la codificación JSON seguida de un reemplazo de </ con <\/ y <! con <\! . Sin embargo, la mejor manera es usar codificación HTML confiable fuera del script:

<div id="my-information" data-something="{{ param1 }}"></div>

<script>
var param1 = document.getElementById('my-information').getAttribute('data-something');
</script>

No tener scripts dinámicos le permite implementar CSP sólidos.

    
respondido por el Ry- 27.11.2014 - 22:33
fuente

Lea otras preguntas en las etiquetas