防止在Lithium / mongoDB中进行表单操作

时间:2012-10-14 11:19:06

标签: mongodb lithium

我正在用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操作添加一些表单输入。当然,它可能是数据库中的一些无意义的字段,但也许有人添加了一个真正使用的字段。 防止这种情况的唯一方法是在模型中创建模式。但对我来说,这使得无模式数据库的整体想法毫无用处,不是吗?当一些字段不能出现时,如何为不同的情况/动作制作模式?

1 个答案:

答案 0 :(得分: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);,这会自动将白名单设置为架构中定义的字段。但是,最好在控制器中定义白名单,以避免像您描述的那样进行攻击。

如果开发人员不小心,这个问题称为mass-assignment vulnerability并存在于许多框架中。