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

标签 javascript security eval

我正在编写一个生成 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/

相关文章:

c# - 在 C# 中动态生成代码

python - 在 Python 中使用 eval 或 exec 设置全局变量

python - 您如何仅在对象上下文中执行 python 'eval'?

javascript - 使用 "mediator"作为监听 block 例程中的接收器

javascript - 如何删除 ractivejs 对象

macos - 如何使用 OS X 的 "security add-trusted-cert"命令为证书指定策略约束? (用于 SSL 网络套接字连接)

php - 暴露用户ID有危险吗?

javascript - 如何在 css/javascript 中制作随分辨率缩放的全出血背景图像?

javascript - 用于查找 5 个连续字母的正则表达式(例如 abcde、noprst)

windows - 如何创建授予所有人所有权限的目录