编码内联javascript对象的正确方法是什么,以保护它免受XSS攻击?

Sam*_*ron 13 html javascript xss json

事实证明以下看起来像有效的JavaScript,不是:

<html> 
<body>
<script>
 json = {test: "</script><script>alert('hello');</script>"};
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

当通过ajax api返回JSON时,相同的文本正如预期的那样工作.但是,当在线渲染时会导致基本的XSS问题.

给定一个任意正确的JSON字符串,我需要做什么服务器端才能使其在线呈现安全?

编辑 理想情况下,我希望修复程序也使用以下字符串:

json = {test: "<\/script><script>alert('hello');<\/script>"};

意思是,我不知道我的底层库是如何编码/char的,它可能已选择对其进行编码,或者它可能没有.(所以它可能正则表达式更强大)

Sri*_*nan 5

请参阅OWASP的XSS预防指南(请参阅规则3)-

除字母数字字符外,请使用\ xHH格式转义所有小于256个字符,以防止将数据值切换到脚本上下文或另一个属性中。不要使用任何转义的快捷方式,例如\“,因为引号字符可能会与首先运行的HTML属性解析器匹配。

假设您的对象是这样的-


var log = {
trace: function(m1, m2, m3){},
debug: function(m1, m2, m3){},
currentLogValue : "trace {].a23-%\/^&",
someOtherObject : {someKey:"somevalue", someOtherKey:"someothervalue"}
};
Run Code Online (Sandbox Code Playgroud)

这样应该最终这样-


var log = {
trace : "function\x28m1,\x20m2,\x20m3\x29\x7B\x7D",
debug : "function\x28m1,\x20m2,\x20m3\x29\x7B\x7D",
currentLogValue : "trace\x20\x7B\x5D.a23\x2D\x25\x5C\x2F\x5E\x26",
someOtherObject : {someKey : "somevalue", someOtherKey:"someothervalue"}
};
Run Code Online (Sandbox Code Playgroud)

规则很简单-

  1. 不可信数据仅允许在一对引号内
  2. 引号内的内容将按以下方式转义-“除字母数字字符外,请使用\ xHH格式转义其他所有内容”

这样可以确保将不受信任的数据始终解释为字符串,而不是函数/对象/其他任何东西。


Guf*_*ffa 4

首先,这根本不是 JSON,而是一个 Javascript 对象。JSON 是一种基于 Javascript 语法的文本格式。

您可以确保代码不包含</字符组合:

var obj = { test: "<"+"/script><script>alert(\"hello\");<"+"/script>" };
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用 XHTML,您可以确保脚本标记中的内容被解释为纯数据:

<script type="text/javascript">
//<![CDATA[
var obj = { test: "</script><script>alert(\"hello\");</script>" };
//]]>
</script>
Run Code Online (Sandbox Code Playgroud)