我已经阅读了备忘单,但我仍然不确定我的数据应该如何转义以防止 XSS,同时允许将任何有效字符插入到 HTML、属性和变量值中。 潜在的变量值在放入任何函数(如parseInt
)之前被正则表达式化。 数据仅通过 WebSocket 连接接收。
JSON.parse 调用任何字符串是否安全? 如果不是,如何通过javascript使数据安全,或者至少测试以查看它是否不符合要求?
何时应相对于 JSON.parse 进行 HTML 和属性转义?
您需要将有效的 json 数据馈送到 JSON 解析函数中。 通常,创建 json 字符串的任何内容都需要创建有效的 json,因此需要转义 html(和其他)字符。
如果你用谷歌搜索"如何转义json",你会得到很多网站,这些网站显示了如何半途而废。
大多数人会指出一小群字符并说这样做:
b Backspace (ascii code 08)
f Form feed (ascii code 0C)
n New line
r Carriage return
t Tab
v Vertical tab
' Apostrophe or single quote
" Double quote
\ Backslash caracter
这是部分正确的。 您需要逃脱:
- 引号 (U+0022)
- 反向固相线 (U+005C)
控制字符 U+0000 到 U+001
,即 ascii32(空格)以下的所有内容参见:http://la.remifa.so/unicode/unicode.php?start=0000&end=007F
这些字符通过使用 \u + 十六进制 ie 进行转义。"\u002F"
这是规格: http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
就个人而言,我只对所有转义序列使用 \u-hex 表示法,我从不担心 json 是否会在 JavaScript 上下文中使用。
Json 和 Javascript 非常酷,因为如果你愿意,你可以将每个字符转义为 \u+hex,这使得 XXS 几乎不可能(尤其是在双引号内时)。
更新:
请记住,转义 json 只是完整 XSS 安全站点的 1 个部分。 您仍然需要担心如何使用 json 字符串,因为它可以作为参数传递到函数中,或者您可以使用数据创建一个数组,或者您可以将字符串放在document.getElementById('xyz').innerHTML(json.data)
因此,如果 json 数据保留在 javascript 上下文中,则可以安全地使用 \u+hex 转义。
当字符串移动到 html 上下文中时,您需要将其视为 html:
document.getElementById('xyz').innerHTML(json.data) //oh-no: now it will in html context
因此,您需要使用如下函数转换 JSON 数据:
var __entityMap = {
"&": "&",
"<": "<",
">": ">",
'"': '"',
"'": ''',
"/": '/'
};
String.prototype.toHtml = function() {
return String(this).replace(/[&<>"'/]/g, function (s) {
return __entityMap[s];
});
}
所以现在你可以这样做:
document.getElementById('xyz').innerHTML(json.data.toHtml() ) //ok -- now safe for html