ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用“new Function(…)”的安全注意事项(在渲染期间,来自我的Javascript源的表达式)

2019-10-08 12:38:34  阅读:923  来源: 互联网

标签:evaluation javascript security eval code-injection


我想使用新的函数(…)从非常简化的代码生成函数.我想这样做

>避免自己解析表达式
>尽可能灵活.

我尽可能避免使用eval().但是我不确定它是否足够安全以使用新功能(…),这也被称为易受安全漏洞影响.

背景

我想管理菜单按钮的状态.所以,在定义按钮时,我想写一些类似的东西

 {
 ..., // More button definition
 state: "isInEditmode && (isWidgetSelected || isCursorInWidget),
 ...
 }

在几个事件期间处理状态转换时,我将检查(汇总)当前整体状态对象的状态与状态属性中的状态.

所以我会在渲染过程中生成一个Function并将其作为DOM对象属性附加,而不是以这种方式附加DOM属性:

 ...
 $el.stateFn = new Function("stateObj", "with (stateObj) {return " + item.state + ";}");
 ...

测试状态:

 visible = $el.stateFn.call(currentStates, currentStates);

with语句帮助我将当前状态对象的属性作为变量提供,以便上面的表达式不需要像obj.isInEditmode那样的东西.

安全问题

在我看来,这不会引入安全漏洞,因为附加到DOM对象的函数是在渲染时生成并从源读取的.还是我错了?我应该避免这个吗?

性能提示受到赞赏(评论)(我认为只要我在渲染时评估一个新的函数,这是可以接受的).

编辑1

>我正在使用Backbone.js.使用另一个框架是不可能的.
>某些菜单项需要绑定到不同甚至多个模型.
>委托(或门面/代理?)模型是相当可观的.

解决方法:

如果允许用户输入在代码中突破,那么安全性也同样糟糕.但是,维护方面,当本地eval与您的示波器混淆并导致动态范围时,您不必担心隐藏的错误.

性能方面,新函数生成的函数与任何其他函数完全相同.生成速度较慢,但​​在eval中它不会导致包含范围不可优化.

事实上,新功能可用于改善以下情况下的性能:

//Will behave like function a( obj ) { return obj.something }
function makePropReader( propName ) {
    return new Function( "obj", "return obj." + propName );
}

构造函数will perform better比这里返回的函数:

function makePropReader( propName ) {
     return function( obj ) {
         return obj[propName];
     }
}

由于必须从闭包上下文动态读取propName,并在每次调用时对对象执行动态读取.

标签:evaluation,javascript,security,eval,code-injection
来源: https://codeday.me/bug/20191008/1871676.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有