Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js-安全地从字符串中执行代码_Javascript_Node.js - Fatal编程技术网

Javascript Node.js-安全地从字符串中执行代码

Javascript Node.js-安全地从字符串中执行代码,javascript,node.js,Javascript,Node.js,我目前正在编写一个MongoDB学习页面,该页面在后端使用Node.js和Express。前端用户的一种可能性是:将自己的查询发送到数据库,并将结果(或错误)返回到前端。他们应该具有对数据库的find/insert/update/-access 查询将作为字符串传输。伪代码:客户端-->-->JSON-->Node.js-Server-->执行查询-->res.send(错误/结果) 首先,Google和Stackoverflow seaches显示,eval()正是我在本例中所需要的。但它也表

我目前正在编写一个MongoDB学习页面,该页面在后端使用Node.js和Express。前端用户的一种可能性是:将自己的查询发送到数据库,并将结果(或错误)返回到前端。他们应该具有对数据库的find/insert/update/-access

查询将作为字符串传输。伪代码:客户端-->-->JSON-->Node.js-Server-->执行查询-->res.send(错误/结果)

首先,Google和Stackoverflow seaches显示,
eval()
正是我在本例中所需要的。但它也表明,
eval()
是非常危险的。我想象一下
var string=“var fs=require('fs');fs.createReadStream(…,function(…){res.send(…)};”
或更糟。聪明的黑客肯定能猜到MongoDB学习页面是基于Node.js的,并能轻松验证使用的框架和数据库驱动程序


您建议怎么做?是否有一种沙箱,只授予对数据库和
res,req
-对象的访问权限?

我的方法是在代码中为发送的字符串创建一个抽象层,而不使用eval。通过web浏览器(客户端)为最终用户提供直接执行的能力本身就是危险的,我们永远不应该这样做

相反,使用和创建字符串解析器

您的应用程序将接收发送的字符串,并对其进行分析以确保其有效性和安全性。您甚至可以在客户端对此类字符串进行实时审查,如果最终用户的字符串格式不正确,则向其提供提示或错误。在分析端,您可以制定相应的操作

在编程和数据库中,这被称为CRUD的脚手架(创建、读取、更新、删除)。创建此抽象层可能需要更多的工作,但为了保护数据库的安全,这是值得的。从某种意义上说,您可以创建自己的沙盒,因为最终,可以运行的唯一数据库执行代码是您在抽象中扩展的代码

以下是此方法中psuedo代码的重构:

Pseudo-Code: Client --> <input type='text'> --> Node.js-Server -->
Sanitize & Parse String Data into a safely executable query --> 
Execution of query --> res.send(error/result).`
伪代码:客户端-->-->Node.js-Server-->
清理并将字符串数据解析为安全可执行查询-->
执行查询-->res.send(错误/结果)`

编辑:显然,学习页面是关于MongoDB的,没有它的支持。尽管如此,我限制访问的第一个想法仍然成立。但是如果需要的只是一种“试用”环境,您可以使用客户端MongoDB实现,如


如果你真的想发送数据库查询,你至少可以限制你的express应用程序使用的MongoDB用户的权限。这可以被认为是一种沙箱——你可以限制用户只进行
读取
操作(当然我想这不是你想要的)

我建议您分析一下前端是否真的需要完整的数据库查询功能。例如,如果您只需要在集合上使用ID的CRUD,您可以使用简单的RESTful Web服务和请求,如:

GET/{collection}/{id}

如果需求变得更复杂,您的API当然会变得更复杂

如果您想公开各种MongoDB功能,应该检查的实现


NodeJS实现可能正是您所需要的。

字符串解析器将需要解析javascript语法。幸运的是,我们已经有了这样一个解析器:jslint。jslint源代码包括一个整洁、注释良好的javascript解析器。基本上它是javascript中的javascript。现在您可以访问解析器代码了,您可以放心了我在问题中收集到的信息是OP实际上是在试图模拟MongoDB学习环境,所以他希望最终用户能够真正创建完整的查询,而不是使用API。啊,我明白了,学习页面是关于MongoDB的。编辑了我的答案。minimongo-这是一个好主意。让他们去破解它们吧r自己的数据库实例。