一方面,如果我有
<script>
var s = 'Hello </script>';
console.log(s);
</script>
瀏覽器會提前終止<script>
塊,基本上我搞砸了頁面。
另一方面,字符串的值可能來自用戶(例如,通過先前提交的表單,現在字符串最終作為文字插入到<script>
塊中),因此您可以期待任何內容字符串,包括惡意形成的標簽。 現在,如果我在生成頁面時使用htmlentities()轉義字符串文字,則s的值將按字面包含轉義的實體,即s將輸出
Hello </script>
在這種情況下,這不是所希望的行為。
在<script>
塊中正確轉義JS字符串的一種方法是,如果它遵循左尖括號,或者只是總是轉義斜杠,則轉義斜杠,即
var s = 'Hello <\/script>';
這似乎工作正常。
然后是HTML事件處理程序中的JS代碼問題,也可以很容易地解決,例如
<div onClick="alert('Hello ">')"></div>
最初看起來有效但在大多數(或所有?)瀏覽器中斷開。 這顯然需要完整的HTML實體編碼。
我的問題是:正確覆蓋上述所有情況的最佳/標准做法是什么 - 即腳本塊中的JS,事件處理程序中的JS - 如果您的JS代碼可以部分地在服務器端生成並且可能包含惡意數據?