安全的方式
问题描述:
比方说,我有我的HTML文档中下面的脚本标签:安全的方式
<script type="application/json" id="stuff">
{
"unicorns": "awesome",
"abc": [1, 2, 3]
}
</script>
和我解析此JSON在我的应用程序。有人告诉我......
这种将json嵌入到脚本标记中的方法存在潜在的安全问题。假设json数据来源于用户输入,可以创建一个数据成员,该成员将实际上脱离脚本标记并允许直接注入dom。在这里看到:
<script type="application/json" id="stuff">
{
"unicorns": "awesome",
"abc": [1, 2, 3],
"badentry": "blah </script><div id='baddiv'>I should not exist.</div><script type="application/json" id='stuff'> ",
}
</script>
我需要在脚本标签使嵌入一个JSON,但我不知道我应该怎么做,如果没有泄漏安全vulnerables。
感谢您的帮助。
答
要将JSON包含在脚本元素中,则需要确保数据不能包含结束标记。检查任何键或值中的'<'是否编码为'\ u003c'。然后使用JSON.parse解析内容。
您还需要确保单个字符串值的数据不会转义字符串,因此也要避免使用引号和反斜杠。
周围的上下文也会引起问题,因为正确的编码可能取决于外部元素的嵌套。引号,html实体,unicode行和段落分隔符以及CDATA关闭标签可能需要编码。为了安全起见,您可以将这些十六进制转义用于任何非字母字符。
你的服务器端语言应该有这样的JSON编码功能。但它们并不都是为了安全而设计的,所以请确保它编码所有这些字符。
答
因为JavaScript固有地在客户端运行,所以您永远不能相信客户端用它做的任何事情。
所以这听起来像用户输入或可能用户输入,就像你在服务器上做的所有事情一样,这意味着你将不得不对任何发送给你的用户输入进行适当的审查。据我所知JSON.parse
被认为是体面安全的。所以发送到你的服务的任何对象都应该使用它来解析。
之后,你可能不得不做一些更多的输入清洗。确保您在打印到浏览器时总是转义HTML。
当你在客户端使用JavaScript时,我认为没有办法阻止数据。尝试使用后端移动安全信息,如用户标识 – PabloWeb18