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的,它可能已选择对其进行编码,或者它可能没有.(所以它可能正则表达式更强大)
请参阅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)
规则很简单-
这样可以确保将不受信任的数据始终解释为字符串,而不是函数/对象/其他任何东西。
首先,这根本不是 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)
| 归档时间: |
|
| 查看次数: |
1892 次 |
| 最近记录: |