javascript - 仅对来自服务器端的数据使用 eval() 是否安全? (如果没有,请提供替代方案)

标签 javascript html ajax security

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

<span runat="server" class="hidden" id="PhotoList" /> 使用代码隐藏 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 也为 View 状态这样做!)。

无论如何,我的重点是评估,这是绝对安全的,还是我应该有一些安全考虑?请 Javascript 专家。

最佳答案

如果您可以确定数据是安全的,那么 eval() 就足够无害了。

如果你不太确定,你可以使用 JSON.parse() 来处理它:

var arr = JSON.parse( "[" + $("#PhotoList").html() + "]" );

对于不支持 JSON 的浏览器,您可以包含 json2图书馆。


另一种可能性是执行 split() 循环项目,将它们从字符串转换为数字。

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

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

编辑:由于您使用的是 jQuery,如果出于某种原因您真的不想使用 .eval(),则使用 jQuery.parseJSON()[docs]方法。

var arr = jQuery.parseJSON("[" + $("#PhotoList").html() + "]");

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

var arr = [];

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

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

关于javascript - 仅对来自服务器端的数据使用 eval() 是否安全? (如果没有,请提供替代方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6727365/

相关文章:

javascript - 如何使用 Promise all() 同时执行两个函数?

javascript - jquery函数在提交后继续运行

javascript - 如何从 .mp3 音乐文件中检测音符,然后显示 MIDI 时间图

javascript - 如何修改多级菜单以与 *ngFor 和 querySelectorAll 一起使用?

javascript - React - 如何从普通类进行导航(无 Redux)

html - 仅为 IE11 加载 css(样式表)

JavaScript、AJAX、PHP : can't set field values after getting json string

html - 如何以文本为背景制作新行?

jquery - 在 Safari 中提交表单后无法对 DOM 进行样式更改

c# - 无法让嵌套在 UpdatePanel 中的 WebControl 中的 ScriptManager.RegisterStartupScript 工作