WHY ???
爲了抵禦Web應用程序一個共同的弱點。如果您在HTML頁面中如說:
<script type="text/javascript">
var something = <%= @something.to_json.html_safe %>;
</script>
,那麼你可能會認爲你是很好,因爲你已經JSON-逃脫你注入的JavaScript數據。但實際上你並不安全:除了JSON語法外,你也有周圍的HTML語法,並且在HTML腳本塊</
中是帶內信號。實際上,如果@something
包含字符串</script>
你有一個跨站點腳本漏洞,因爲這出來:
<script type="text/javascript">
var something = {"attack": "abc</script><script>alert('XSS');//"};
</script>
第一個腳本塊通過串(留下一個未關閉字符串文字語法錯誤)和中途結束第二個<script>
被視爲一個新的腳本塊,並在其中執行潛在用戶提交的內容。
JSON不需要將<
字符轉義爲\u003C
,但它是完全有效的替代方案,它會自動避免這類問題。如果JSON解析器拒絕它,這是讀者中的一個嚴重錯誤。
什麼是產生該錯誤的代碼?我不相信這個錯誤與<
轉義有什麼關係,因爲它談論的是字節0xC3而不是0x3C。這可能表示UTF-8編碼內容沒有被標記爲UTF-8的字符串...也許你需要在輸入上使用force_encoding("UTF-8")
?
試試這個:JSON.generate({ 「A」=> 「
」}:ascii_only =>真) – user2503775