gpt4 book ai didi

Node.JS 将 eval 输出重定向到字符串

转载 作者:搜寻专家 更新时间:2023-11-01 00:29:15 27 4
gpt4 key购买 nike

我可以将 nodejs eval 输出重定向到字符串或任何其他方式吗?

编辑:我需要将其作为字符串返回,作为我的网络应用程序(发布数据)的响应

var http = require('http');

var server = http.createServer(function(req, res) {
var script = '';
if (req.method === 'POST' && req.url === '/doeval') {
req.on('data', function(chunk) {
script += chunk;
});

req.on('end', function() {
// script = 'console.log("aaaa")';

var result = eval(script);
res.write(String(result));
res.end();
});
}
}
}

server.listen(80);

输出:

result: undefined

预期:

result: aaaa

最佳答案

注意:运行不受信任的代码是极其危险的,无论选择哪种解决方案,您都应该格外小心。这里提出的那个也有缺陷。为了更安全,考虑使用容器,例如 dockerlxc .


在这种情况下不要使用eval。这是工作的错误工具。您真的希望在您的网络服务器上下文中对任意代码进行 eval 处理吗?如果发送的代码是 throw new Error('haha')process.exit() 怎么办?这是一个巨大的安全隐患!将代码写入一个临时文件,生成一个 Node 进程来执行该文件并读取其输出。参见 https://nodejs.org/api/child_process.html .

例子:

var http = require('http');
var fs = require('fs');
var childProcess = require('child_process');

var server = http.createServer(function(req, res) {
var script = '';
if (req.method === 'POST' && req.url === '/doeval') {
req.on('data', function(chunk) {
script += chunk;
});

req.on('end', function() {
var tempFileName = Date.now() + '.js';
fs.writeFile(tempFileName, script, function(err) {
if (err) {
// handle error
}

child_process.execFile('node', [tempFileName], function(err, stdout, stderr) {
if (err) {
// handle err
}

// Delete tempfile...

res.write(stdout);
res.end();
});
});
});
}
}
}

server.listen(80);

现有的 npm 包可以帮助创建和清理临时文件。另请查看 child_process 的其他方法。

但是,这还不安全,因为子进程将以与您的服务器相同的权限运行(从外观上看,它以 root 运行:-/) .

您应该将文件和子进程的所有者(和组)设置为 nobody 或其他一些基本上无权访问任何内容的系统用户。 Or chroot the subprocess .

关于Node.JS 将 eval 输出重定向到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44072719/

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