gpt4 book ai didi

javascript - 使用 Javascript eval() 100% 安全吗?

转载 作者:搜寻专家 更新时间:2023-11-01 04:44:48 24 4
gpt4 key购买 nike

我正在编写一个生成 Javascript 代码的 PHP 库。

Javascript 代码有许多组件,名为component001component002 等。

页面通过 AJAX 动态加载。

我需要通过 URL 变量传递组件的名称,然后由脚本对其进行 evaled()。

我保护正在评估的内容的唯一方法是使用正则表达式 ^component[0-9]{3}$:如果它通过,它就会被评估,否则它不会。

对我来说这是 100% 安全的,因为除非它只是我已知组件之一的名称,否则什么都不会执行,或者 eval() 命令有什么可能在此代码示例中被利用,例如正则表达式注入(inject)、某种跨站点脚本等?

window.onload = function() {

// *** DEFINED IN ANOTHER JAVASCRIPT FILE:
var component001 = 'testing111';
var component002 = 'testing222';
var component003 = 'testing333';

var APP = {};

APP.getUrlVars = function() {
var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for(var i = 0; i < hashes.length; i++) {
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
}

APP.getUrlVar = function(name, defaultValue) {
defaultValue = (typeof defaultValue == 'undefined') ? '' : defaultValue;
var vars = APP.getUrlVars();
if(vars[name] === undefined)
{
return defaultValue;
} else {
return vars[name];
}
}

APP.safeEval = function(nameOfComponent) {
var REGEX_VALID_NAME = /^component[0-9]{3}$/;
if(REGEX_VALID_NAME.test(nameOfComponent)) {
return eval(nameOfComponent);
} else {
return 'ERROR';
}

}

// *** JAVASCRIPT FILE LOADED VIA AJAX:

var nameOfComponentToDisplay = APP.getUrlVar('compname', 'component001');
var component = APP.safeEval(nameOfComponentToDisplay);
document.write(component);

}

最佳答案

使用 eval 的理由几乎为零,我认为这不是其中之一。请记住,所有对象都像字典一样工作,因此您可以简单地执行以下操作:

var components = {
component001 : 'testing111',
component002 : 'testing222',
component003 : 'testing333'
};

APP.safeEval = function(nameOfComponent) {
var result = components[nameOfComponent];
if(result) {
return result;
} else {
return 'ERROR';
}
}

关于javascript - 使用 Javascript eval() 100% 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4500373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com