是否仅使用eval()来获取来自服务器端安全的数据?(如果没有,请替代)

Can*_*ğlu 2 html javascript security ajax

我正在创建一个网站,在我加载静态容器页面后,我正在执行ajax请求以加载一些动态内容.基本上,我需要从服务器传递一个整数数组到页面,我正在使用jQuery来加载数据.我在具有已知名称的标签内写入int,并使用eval从中读取数据.这是一个示例标记(从ajax返回):

<span runat="server" class="hidden" id="PhotoList" /> 使用codebhind list.ForEach(p => { sb.Append(p.ID.ToString() + ","); } );,其中sb是一个StringBuilder,因此服务器作为结果返回如下内容:

<span runat="server" class="hidden" id="PhotoList">1,4,5,42,9</span>

photoList在javascript中声明了一个变量,然后我调用了var scriptToEval = "photoList = [" + $("#PhotoList").html() + "];";

eval(scriptToEval);

我不是Javascript的主人,我只是想确保这是安全的,因为有很多讨论是否 eval安全与否.我认为这是安全的(我粘贴的是我使用eval的所有代码),但我可能错过了一点,所以专业人士的意见对我很重要.我知道为什么他们说eval是危险的,因为它能够解释任何恶意与否的代码,但在这里,我认为这种方式根本无法妥协,因为来自服务器的响应完全在我的控制之下.另一种选择是对变量进行另一个ajax调用并直接加载它们而不从返回的数组中获取ajax,但是它会总结为两个调用,(我已经进行了加载调用,因为它确实从服务器加载了一些HTML内容)但是这样,即使有点hacky(将变量放入隐藏的HTML标记中),看起来也很方便(毕竟ASP.NET也为viewstate做了这个!).

无论如何,我的重点是eval,这是非常安全的,还是应该考虑一些安全性?请高手朋友.

use*_*716 5

如果您可以确定数据是安全的,那么eval()将是无害的.

如果你不太确定,你可以JSON.parse()用来照顾它:

var arr = JSON.parse( "[" + $("#PhotoList").html() + "]" );
Run Code Online (Sandbox Code Playgroud)

对于不支持的浏览器,JSON可以包含json2库.


另一种可能性是split()循环项目,将它们转换为字符串中的数字.

var arr = $("#PhotoList").html().split(',');

for( var i = 0, len = arr.length; i < len; i++ ) {
    arr[i] = parseInt( arr[i], 10 );
}
Run Code Online (Sandbox Code Playgroud)

编辑:因为你正在使用jQuery,如果由于某种原因你真的不想要.eval(),那么使用jQuery.parseJSON()[docs]方法.

var arr = jQuery.parseJSON("[" + $("#PhotoList").html() + "]");
Run Code Online (Sandbox Code Playgroud)

编辑2:另一种方法是使用.replace(),传递一个函数作为替换值.这将为您处理迭代.

var arr = [];

$("#PhotoList").html().replace(/\d+/g, function( s ) { arr.push( parseInt(s,10) ); });
Run Code Online (Sandbox Code Playgroud)

......有很多方法可以做到这一点.