2

我正在用 Lithium 和 mongoDB 编写我的第一个社区页面。我真的很喜欢 mongo 的无模式方式,但是有一个问题使得没有模式就无法工作:

例如,我们有一个像这样的简单表格:

<?=$this->form->create();?>
<?=$this->form->field('name',array('label' => 'Topic title'));?>
<?=$this->form->field('text',array('label' => 'Content'));?>
<?=$this->form->submit('create');?>

这将更简单地保存:

if($this->request->is('post')) {
    $board_post = BoardPosts::create($this->request->data);
    $board_post->save();
}

现在大家可以通过Firebug、开发者工具等DOM操作添加一些表单输入了。当然可能是数据库中一些无意义的字段,但也许有人添加了一个真正有用的字段。防止这种情况的唯一方法是在模型中创建模式。但对我来说,这使得无模式数据库的整个想法毫无用处,不是吗?当某些字段不能出现时,如何为不同的情况/动作制作模式?

4

1 回答 1

4

Model::save()方法在其选项中接受一个'whitelist'参数。见http://li3.me/docs/lithium/data/Model::save()

$whitelist = array(
    'title',
    'text'
);
$post = BoardPosts::create();
$post->save($this->request->data, compact('whitelist')); 

您还可以protected $_schema在模型中定义并设置protected $_meta = array('locked' => true);哪个会自动将白名单设置为架构中定义的字段。但是,最好在控制器中定义白名单以避免像您描述的那样的攻击。

这个问题被称为批量分配漏洞,如果开发人员不小心,它会存在于许多框架中。

于 2012-10-14T14:02:55.777 回答