¿Por qué esto causa XSS? ¿Y cómo puedo prevenirlo?

4

Este es mi código fuente:

<!DOCTYPE html>
<html>
  <head>
    <title>XSS</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script><script>varoutput="";
    <?php
    if (isset($_GET['q'])) {
      printf('output = "%s";', htmlspecialchars($_GET['q'],ENT_QUOTES, 'UTF-8'));
    }
    ?>

    $(function()  {
      $("#output").html(output);
    });
    </script>
  </head>
  <body>
    <p id="output"></p>
  </body>
</html> 

Cuando envío q=\x3cscript\x3ealert(1)\x3c/script\x3e a mi script, se activa la alerta. ¿Cómo puedo prevenir esto?

    
pregunta Sigi Amon 22.03.2017 - 08:01
fuente

1 respuesta

8

El escape es sensible al contexto. Estás escapando para HTML, pero estás usando la variable en Javascript. En su lugar, codifique correctamente JavaScript usando json_encode :

printf('output = %s;', json_encode($_GET['q']));

Además, estás utilizando la función html aunque parece que no quieres HTML en absoluto. Lo que probablemente desee es la función text :

$("#output").text(output);
    
respondido por el Sjoerd 22.03.2017 - 10:52
fuente

Lea otras preguntas en las etiquetas