我有一个带有AngularJS前端的.NET后端。 当用户输入他的名字
时,一切正常(没有执行JavaScript)<script>alert('xss');</script>
数据作为Json发送到我的后端未编码,我保存在数据库中输入的文本,然后发送文本,如Json,在读取数据时未编码回到前端。
这一切都如上所述,但是看着他们建议对Json进行编码的安全课程。
在我的情况下,我应该更好地编码我的Json吗?
这是保存和加载时Json的一部分:
,"aanvragernaam":"<script>alert('xss');</script>","
答案 0 :(得分:1)
您可能希望进行输入验证并拒绝括号,因为名称很少包含这些。然而,这不是一个足够的安全控制,好像我们想要支持其他类型的数据(例如评论),我们可能需要支持这些字符,因此我们的控制不起作用。
在JSON中使用HTML(脚本标记等)的风险是,攻击者可以以某种方式欺骗用户加载并在浏览器中将其显示为HTML。这曾经是非常简单的&lt; IE9作为那些浏览器不知道Content-Type应用程序/ json是什么。因此,浏览器会尝试猜测(嗅探)内容。但是,可以使用标题X-Content-Type-Options: nosniff
禁用此类型的嗅探。
您可以通过添加
进一步加强保护Content-Disposition: attachment;filename=data.json
X-Download-Options: NoOpen
如果用户尝试直接在浏览器窗口中打开JSON,则将下载该文件而不是显示该文件。
恕我直言,JSON中无需编码。
答案 1 :(得分:1)
只要您将内容类型设置为application/json
然后this content type will not be sniffed by browsers,因为它不是&#34;已知&#34;。因此,这应该对XSS安全。
无需进一步编码。
JSON Hijacking是GET请求的另一个漏洞,但它是not an issue in modern browsers。
我看到的唯一其他风险是DOM XSS。只要你没有写出价值&#34;就像#34;进入DOM,然后没有XSS风险。如果您是,那么您应该对其进行HTML编码,或者使用JQuery或JavaScript根据需要正确设置text
/ textContent
,以便浏览器不会将其解释为脚本。
请注意,此处的风险不是<script>alert('xss')</script>
,它必须与<img src=x onload="alert('xss');" />
类似,才能在动态添加到文档时执行。
答案 2 :(得分:0)
我认为在向后端发送请求以将名称保存到数据库之前,您应该使用encodeURI(name)。
当您从后端接收数据时,您将使用decodeURI功能。