我刚刚意识到在做基本的CakePHP时,有一个非常糟糕的安全问题,许多人不一定注意到。我将采用我认为许多用户在使用CakePHP驱动的应用程序时使用的基本功能。
function edit() {
if(!empty($this->data)) {
if($this->User->save($this->data)) {
}
}
}
让我们假设用户有权使用此操作。此操作可能是编辑用户信息,其可能具有城市,号码和课程用户名。让我们假设我们想要一个允许我们只编辑城市和数字而不是用户名的表单。那么如果有人只是用firebug将那个用户名字段插入到那个表单中呢?然后提交表格。现在编辑只会获取所有帖子信息,包括用户名字段及其值,并立即编辑它们。因此,即使没有相应的字段,您也可以在这种情况下更改用户名。
如果有人使用saveAll(),这可以更进一步,它允许您一次性验证和保存多个模型。如果您可以从表单字段中猜出要使用的模型,您可以轻松地转到其他模型和表格并更改这些信息。
现在您了解我的疑虑,我的问题是什么是最好的或至少接近避免这种情况的最佳方法?
我知道我可以从$ this->数据中获取我想要的数据到其他变量,然后将其传递给save或saveAll,但因为有很多表单和ajax请求,这将是相当多的工作。但这是唯一的出路还是有更好的方法?
我应该制作还是有行为可以阻止这种情况?比如检查一些控制器中的某些动作可以从帖子中获取哪些变量?
答案 0 :(得分:2)
经过几天的研究,我发现这不是一个“安全漏洞”,而是初学者的错误。
有两种方法可以避免这种形式的篡改:安全组件(http://book.cakephp.org/view/1296/Security-Component)通过为表单字段创建一次性哈希来自动获取CSRF并形成篡改保护。
另一种方法是将第三个参数赋予save()函数。保存实际上有3个参数:data,validate,fieldlist。 fieldlist参数的作用类似于允许保存的字段的白名单。
我首先将这个问题报告为cakephp的一个错误,然后它就没有了,但是这个这个欧元标记的家伙回答我说他已经做好了关于实际问题的记录,以及如何进行安全保存,我觉得这很好读。因此,如果您遇到同样的问题,请参阅此页:http://www.dereuromark.de/2010/09/21/saving-model-data-and-security/