come possono essere inclusi i valori non attendibili in una pagina html come costanti stringa javascript? Anche se il caso che sto chiedendo usa JSF e Rails, penso che questo sia un problema generale indipendente dal framework lato server.
on-attributi
Ovviamente non è sufficiente per uscire da \ "" in on-attributes:
onclick='alert("[variable]")'
variable: hello, world"); alert("XSS
result: alert("hello, world"); alert("XSS")
In Firefox questo mostrerà un "Ciao, mondo" e una finestra di dialogo di avviso "XSS". Poiché la variabile non contiene un ", la funzione Rails escape_javascript non è sufficiente in questo contesto. l'escape sembra essere sicuro, in quanto solo la finestra di dialogo originale è mostrata in questo caso:
result: onlick='alert("hello, world"); alert("XSS")'
Script-tag
In < script > i tag, tuttavia, in Firefox si applicano regole diverse:
<script type="text/javascript">
alert("hello, world"); alert("XSS");
</script>
Questo visualizza solo una finestra di dialogo; ma le virgolette sono visualizzate nella loro forma di escape. Ci sono due conclusioni: 1a) & quot; non è analizzato come un segno di virgolette JavaScript (buono), 2) non è analizzato in base alle regole HTML (male). In modo che qualsiasi tentativo di html di uscire dalla costante crei dati danneggiati.
Ignorare l'escaping HTML nei tag di script, tuttavia, non è un'opzione:
<script type="text/javascript">alert("[variable]");</script>
variable: hello, world</script><script>alert("XSS
result: <script type="text/javascript">
alert("hello, world</script><script>alert("XSS");</script>
Il primo tag script crea un errore di sintassi a causa della mancanza ". Ma in Firefox viene eseguito il secondo tag script immesso.
tl, dr
C'è un modo sicuro per scrivere valori non affidabili per le costanti JavaScript? Questo sembra essere un casino totale, e al momento mi sto orientando verso l'uso di elementi html (con style="dispaly: none"). Una chiamata XMLHttpRequest che utilizza JSON sarebbe un'altra opzione. Ma entrambi gli approcci sembrano imbrogliare.