1

作为我正在编写的软件的一个功能,我允许自己创建用 JS 编写的计算器,以使用所述数据作为参考来计算应用于特定数据集的费用。由于我使用的是 Mongo,我可以安全地在服务器端运行它,浏览器可以调用一个 php 页面并获得响应。该函数将从管理控制面板写入并保存到数据库中。我当然不会在该函数内部进行任何数据库交互,但是执行 mongocode 是在数据库中完成的,所以 mongocode 本质上可以做到db.foo

只是为了保护自己和其他可能最终会写计算器的人,我已经决定db = null;$context传给new MongoCode()

它看起来有点像这样:

$sample = [
    'estimatedvalue' => 200,
    'estimatedcost' => 400,
    'contractor'    => false,
    'db'    => null,
];
$fees = [
    '_id'   => new MongoId(),
    'name'  => 'Friendly name!',
    'code'  => new MongoCode('function(){return (contractor ? estimatedCost : estimatedValue)*0.01; /* If a contractor is doing the work, base fee on cost. */}', $sample),
];

$a = $this->siteDB->execute($fees['code']);

if(isset($a['errno'])){
    echo $a['errmsg'];
}else{
    var_dump($a['retval']);
}

幸运的是,这行得通,如果我要将其注入所有上下文中,就不会有db.可运行的命令。我不想创建一个可能发生 NoSQL 注入的点!

这可以防止的一个例子是:

 'code' => new MongoCode('function(){db.foo.remove();}', $sample),
 // Since db is now null, the above won't work

我的担忧:此 MongoCode 执行环境中是否存在任何其他变量,这些变量可能对留在用户可编辑函数中造成潜在危害?我找不到任何关于通过 mongocode 函数可以访问其他内容的文档。如果db是的话,那我就准备好了!

4

1 回答 1

1

这是不安全的,我认为您不能拥有用户可编辑的 JS 函数。例如,这不需要变量并关闭您的服务器:

> db.eval("(new Mongo('localhost:27017')).getDB('admin').shutdownServer()")

他们可以插入数据、删除数据库、连接到系统中的其他服务器,并且通常会造成严重破坏。

如果您试图在 JavaScript 中允许用户可编辑的计算函数,请使用单独的 JS 引擎,从 MongoDB 中提取值,然后将值 + 用户定义的函数传递给完全独立的 JS 引擎。

于 2012-12-07T16:21:10.573 回答