2012-01-12 115 views
2

它足够简单创建一个JSON对象是这样的:在JSON中传递JS函数有哪些XSS危险?

{ “键”: “值”, “myFunction的”:函数(){警报( '喜'); }}

并将它从服务器传递到可以调用myFunction()的脚本。果然,该功能起作用,我收到一条警告:“嗨”。对我来说,这可能是保持脚本尺寸很小的一种非常有用的方法。 但是,我相信在传递函数中存在XSS危险,而不仅仅是通过JSON数据。有人可以解释这些是什么,如果适当的话,可以采取什么措施来否定它们?

回答

2

function不是JSON的一部分,因为JSON不是JavaScript。

大多数库都使用JSON解析器(当它们可以的时候,browser's one)。所以这不会被正确解析。尽管使用eval来解析JSON是邪恶eval是邪恶的一般。

而你一直在使用<script>加载JavaScript,所以我在这里看不到有关XSS的问题。

0

这取决于你如何加载和解析JSON。如果您使用jQuery并通过AJAX加载数据,那么该数据将传递给浏览器的内置JSON解析器,该解析器不支持greut所解释的函数。 http://erlend.oftedal.no/blog/misc/json/index.html

然而,如果你加载它通过两种JSONP(缠绕它的功能),由JSON在例如像Socialcast页面是否结束在脚本标签直接添加它,那么它的脆弱。 http://erlend.oftedal.no/blog/misc/json/index2.html

如果您遇到了最后一个问题,您应该记住JSON值(和键)应该总是包裹在“”中。所以如果你从不受信任的数据构建JSON,你必须记住JSON对它进行编码。这有点类似于Javascript编码,除了JSON有一些额外的怪癖。例如,您可以拥有一个有效的JSON文件,该文件不是有效的JavaScript,因为它包含JSON中允许的字符,但需要使用JavaScript进行编码。