javascript - JSON.parse 转义以防止 XSS 以及将任何字符插入到来自 WebSockets 的 html、属性和值中

标签 javascript json parsing websocket xss

我已阅读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 + 十六进制即进行转义。 “\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 = {
    "&": "&",
    "<": "&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

关于javascript - JSON.parse 转义以防止 XSS 以及将任何字符插入到来自 WebSockets 的 html、属性和值中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22273198/

相关文章:

javascript - 访问、解析和写入 .csv 数据 - google apps 脚本

jquery - 使用 jQuery 解析 JSON

javascript - 形式参数后缺少 jquery/javascript )

php - 如何在 javascript 中访问 php $_SESSION 数组?

javascript - 在服务器目录中查找最新的 JSON 文件

android - 使用Twitter搜索API和from:用户名运算符搜索用户的tweet

javascript - phonegap读写json文件

javascript - Kendo UI Tabstrip : Tab should render a grid after clicking on a button inside that tab

javascript - 当从子元素调用的 javascript 更改类时,CSS 转换不起作用

c++ - 在 C++ 中使用字符串数组