DLACZEGO ???
Do obrony przed powszechną słabością aplikacji internetowych. Jeśli powiesz na stronie HTML, np:
<script type="text/javascript">
var something = <%= @something.to_json.html_safe %>;
</script>
czym myślisz, że jesteś w porządku, bo już JSON-uniknął danych jesteś wstrzykiwanie do JavaScript. Ale w rzeczywistości nie jesteś bezpieczny: oprócz składni JSON masz również otaczającą składnię HTML, aw bloku skryptu HTML </
jest sygnalizacja wewnątrzpasmowa. Praktycznie, jeśli @something
zawiera ciąg </script>
masz usterkę cross-site scripting, jak to wychodzi:
<script type="text/javascript">
var something = {"attack": "abc</script><script>alert('XSS');//"};
</script>
Pierwszy blok skryptu kończy się w połowie łańcucha (wyjazd o unclosed ciąg dosłownego błąd składni) i drugi <script>
jest traktowany jako nowy blok skryptu i wykonywana treść potencjalnie przez niego wysłana.
Ucieczka ze znaku <
do \u003C
nie jest wymagana przez JSON, ale jest to całkowicie poprawna alternatywa i automatycznie unika tej klasy problemów. Jeśli parser JSON go odrzuca, jest to poważny błąd w czytniku.
Co to jest kod, który generuje ten błąd? Nie jestem przekonany, czy ten błąd ma coś wspólnego z wykrywaniem <
, ponieważ mówi o bajcie 0xC3 zamiast 0x3C. Może to wskazywać na ciąg znaków z zakodowaną w UTF-8 treścią nie oznaczoną jako UTF-8 ... może potrzebujesz force_encoding("UTF-8")
na wejściu?
Spróbuj tego: JSON.generate ({ "a" => "
"}: ascii_only => true) – user2503775