PERCHÉ ???
Per difendersi da una debolezza comune nelle applicazioni web. Se si dice in una pagina HTML per esempio:
<script type="text/javascript">
var something = <%= @something.to_json.html_safe %>;
</script>
allora si potrebbe pensare che stai bene perché hai JSON escape i dati che si sta iniettando in JavaScript. Ma in realtà non sei al sicuro: a parte la sintassi JSON hai anche la sintassi HTML circostante, e in un blocco di script HTML </
è la segnalazione in-band. In pratica, se @something
contiene la stringa </script>
hai una vulnerabilità cross-site scripting in quanto questo viene fuori:
<script type="text/javascript">
var something = {"attack": "abc</script><script>alert('XSS');//"};
</script>
Il primo blocco di script termina a metà strada attraverso la stringa (lasciando un errore di sintassi letterale di stringa non chiusa) e la il secondo <script>
viene considerato come un nuovo blocco di script e viene eseguito il contenuto potenzialmente inviato dall'utente all'interno di esso.
L'escape del carattere <
su \u003C
non è richiesto da JSON ma è un'alternativa perfettamente valida e evita automaticamente questa classe di problemi. Se un parser JSON lo rifiuta, si tratta di un bug grave nel lettore.
Qual è il codice che sta producendo quell'errore? Non sono convinto che l'errore abbia a che fare con lo <
-escaping, poiché si tratta di byte 0xC3 anziché 0x3C. Questo potrebbe essere indicativo di una stringa con contenuto codificato UTF-8 che non è stata contrassegnata come UTF-8 ... forse hai bisogno di un force_encoding("UTF-8")
sull'input?
Prova questa: JSON.generate ({ "a" => "
"},: ascii_only => true) – user2503775