ajax请求返回一个标有我用户输入的JSON数组.输入已经过清理,使用eval()函数,我可以轻松创建我的javascript对象并更新我的页面...
所以这就是问题所在.无论我如何努力消毒输入,我宁愿不使用eval()函数.我已经检查了谷歌如何使用"没有评估的AJAX中的JSON",并且已经运行了很多不同的方法......
我应该使用哪一个?是否有标准的,经过验证的安全方法?
json.org有一个很好的JavaScript库
简单用法:
JSON.parse('[{"some":"json"}]'); JSON.stringify([{some:'json'}]);
编辑:正如评论中所指出的,如果你查看它的来源,它会使用eval(尽管它看起来首先要消毒)
要完全避免它,请查看json_parse或json-sans-eval
json2.js是不安全的,json_parse.js很慢,json-sans-eval.js是非验证的
是否有标准的,经过验证的安全方法?
在即将推出的ECMAScript 3.1版JavaScript:JSON.parse中,有一种提议的标准方法.
这将在IE8的支持,火狐3.1/3.5和最有可能在今后其他流行的浏览器.在此期间,您可以退回或专门使用eval().邪恶可能会也可能不会; 当然它会比JSON.parse慢.但这是今天解析JSON的常用方法.
如果攻击者能够将狡猾的JavaScript注入您通过JSON吐出的内容,那么您需要担心的问题比eval-evil更大.
我会说,一旦输入被消毒,eval就是最好的方法.如果您的服务器遭到入侵,人们将无论如何都能够将他们想要的任何脚本发送给客户端.所以放一个评估并不是一个很大的安全风险.如果您担心人们在到达客户端之前操纵数据包,那么可以再次修改脚本本身.
不要担心eval.但请确保将其包装在try ... catch块中,这样如果您的JSON被破坏,您的用户就不会收到JS错误.
:)