我已阅读cheat sheet ,但我仍然不确定应该如何对我的数据进行转义以防止 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 + 十六进制即进行转义。 “\u002F”
这是规范:http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
就我个人而言,我只对所有转义序列使用\u-hex 表示法,而且我从不担心 json 是否可以在 JavaScript 上下文中使用。
Json 和 Javascript 非常酷,因为如果你愿意,你可以将每个字符转义为\u+hex,这使得 XXS 几乎不可能(特别是在双引号内时)。
更新:
请记住,转义 json 只是完整 XSS 安全站点的一部分。您仍然需要担心如何使用 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
关于javascript - JSON.parse 转义以防止 XSS 以及将任何字符插入到来自 WebSockets 的 html、属性和值中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22273198/