Edw*_*uay 4 javascript security eval
我正在编写一个生成Javascript代码的PHP库.
JavaScript代码有一些命名组件component001,component002等等.
页面通过AJAX动态加载.
我需要通过URL变量传递组件的名称,然后由脚本evaled().
我正在保护正在被唤醒的东西的唯一方法是使用正则表达式^component[0-9]{3}$:如果它通过则会被篡改,否则就不会.
对我来说这是100%安全的,因为没有任何东西会被执行,除非它只是我的一个已知组件的名称,或者是否有关于eval()该代码示例中可以利用的命令,例如正则表达式注入,某种交叉站点脚本等?
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);
}
Run Code Online (Sandbox Code Playgroud)
Cha*_*ion 15
几乎没有理由使用eval,我认为这不是其中之一.请记住,所有对象都像字典一样,所以你可以简单地做这样的事情:
var components = {
component001 : 'testing111',
component002 : 'testing222',
component003 : 'testing333'
};
APP.safeEval = function(nameOfComponent) {
var result = components[nameOfComponent];
if(result) {
return result;
} else {
return 'ERROR';
}
}
Run Code Online (Sandbox Code Playgroud)