Perché questo causa XSS? E come posso prevenirlo?

4

Questo è il mio codice sorgente:

<!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> 

Quando invio q=\x3cscript\x3ealert(1)\x3c/script\x3e al mio script, l'avviso è attivato. Come posso impedirlo?

    
posta Sigi Amon 22.03.2017 - 08:01
fonte

1 risposta

8

L'escaping è sensibile al contesto. Stai sfuggendo per HTML, ma stai usando la variabile in Javascript. Invece, codifica correttamente per JavaScript utilizzando json_encode :

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

Inoltre, stai utilizzando la funzione html anche se non sembra affatto che tu voglia HTML. Quello che probabilmente vorresti è la funzione text :

$("#output").text(output);
    
risposta data 22.03.2017 - 10:52
fonte

Leggi altre domande sui tag