作为我正在编写的软件的一个功能,我允许自己创建用 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
是的话,那我就准备好了!