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