安全的方式

问题描述:

比方说,我有我的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。

感谢您的帮助。

+0

当你在客户端使用JavaScript时,我认为没有办法阻止数据。尝试使用后端移动安全信息,如用户标识 – PabloWeb18

要将JSON包含在脚本元素中,则需要确保数据不能包含结束标记。检查任何键或值中的'<'是否编码为'\ u003c'。然后使用JSON.parse解析内容。

您还需要确保单个字符串值的数据不会转义字符串,因此也要避免使用引号和反斜杠。

周围的上下文也会引起问题,因为正确的编码可能取决于外部元素的嵌套。引号,html实体,unicode行和段落分隔符以及CDATA关闭标签可能需要编码。为了安全起见,您可以将这些十六进制转义用于任何非字母字符。

你的服务器端语言应该有这样的JSON编码功能。但它们并不都是为了安全而设计的,所以请确保它编码所有这些字符。

因为JavaScript固有地在客户端运行,所以您永远不能相信客户端用它做的任何事情。

所以这听起来像用户输入或可能用户输入,就像你在服务器上做的所有事情一样,这意味着你将不得不对任何发送给你的用户输入进行适当的审查。据我所知JSON.parse被认为是体面安全的。所以发送到你的服务的任何对象都应该使用它来解析。

之后,你可能不得不做一些更多的输入清洗。确保您在打印到浏览器时总是转义HTML。