JSON.parse 转义反 XSS 和任何字符插入到 html、属性和 WebSocket 的值中



我已经阅读了备忘单,但我仍然不确定我的数据应该如何转义以防止 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 = {
"&": "&",
"<": "&lt;",
">": "&gt;",
'"': '&quot;',
"'": '&#39;',
"/": '&#x2F;'
};
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

最新更新