
给定类似JSON的内容,JSON Sanitizer 会将其转换为有效的JSON。
它可以附加在数据管道的任一端,以帮助满足Postel原则:
在自己做什么时要保守,在接受别人给予时要开放
应用于来自他人的类似JSON的内容时,它会生成格式良好的JSON,应能满足您使用的任何解析器。
在发送之前应用于您的输出时,它会纠正编码中的小错误,并使您的JSON更易于嵌入HTML和XML。

许多应用程序有大量代码使用临时方法生成JSON输出。
通常这些输出在通过网络发送之前都会经过少量框架代码。这少量框架代码可以使用此库确保临时输出符合标准,并且安全地传递给(过于)强大的反序列化器,例如Javascript的eval操作符。
应用程序也经常有从各种来源接收JSON的Web服务API。当这个JSON是使用临时方法创建时,此库可以将其整理成易于解析的形式。
通过将此库挂接到发送和接收请求及响应的代码中,此库可以帮助软件架构师确保系统范围的安全性和良好格式保证。
消毒器接受类似JSON的内容,并像JS的eval一样解释它。具体来说,它处理以下非标准结构。
| 结构 | 策略 |
|---|---|
'...' | 单引号字符串转换为JSON字符串。 |
\xAB | 十六进制转义转换为JSON Unicode转义。 |
\012 | 八进制转义转换为JSON Unicode转义。 |
0xAB | 十六进制整数字面量转换为JSON十进制数字。 |
012 | 八进制整数字面量转换为JSON十进制数字。 |
+.5 | 十进制数字被强制转换为JSON的更严格格式。 |
[0,,2] | 数组中的省略项用null填充。 |
[1,2,3,] | 删除尾随逗号。 |
{foo:"bar"} | 未加引号的属性名称被引用。 |
//comments | 删除JS风格的行注释和块注释。 |
(...) | 删除分组括号。 |
消毒器修复缺失的标点、结束引号以及不匹配或缺失的闭合括号。如果输入仅包含空白,则替换为有效的JSON字符串null。
输出是符合RFC 4627定义的格式良好的JSON。输出满足以下附加属性:
"<script"、"</script"或"<!--",因此可以无需额外编码嵌入到HTML script元素中。"]]>",因此可以无需额外编码嵌入到XML CDATA段中。eval(包裹在括号中后)或JSON.parse进行解析。具体来说,输出将不包含任何嵌有JS新行符(U+2028段落分隔符或U+2029行分隔符)的字符串字面量。由于输出是格式良好的JSON,将其传递给eval不会产生副作用,也没有自由变量,因此既不是代码注入向量,也不是秘密泄露向量。
此库仅确保JSON字符串→Javascript对象阶段没有副作用且不解析自由变量,并且无法控制其他客户端代码随后如何解释生成的Javascript对象。因此,如果客户端代码获取了由攻击者控制的解析数据的一部分,并将其传回给诸如eval或innerHTML之类的强大解释器,则该客户端代码可能会遭受非预期的副作用。
var myValue = eval(sanitizedJsonString); // safe
var myEmbeddedValue = eval(myValue.foo); // possibly unsafe
此外,消毒JSON无法保护应用程序免受Confused Deputy attacks
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
当输入已经是满足上述属性的有效JSON时,sanitize方法将返回输入字符串而不分配新缓冲区。因此,如果用于通常格式良好的输入,它只有最小的内存开销。
sanitize方法的时间复杂度为O(n),其中n是输入以UTF-16代码单元计的长度。