CakePHP 在保存修改数据时会自动处理批量赋值漏洞吗?
Posted
技术标签:
【中文标题】CakePHP 在保存修改数据时会自动处理批量赋值漏洞吗?【英文标题】:Does CakePHP automatically deal with mass assignment vulnerabilities when saving modified data? 【发布时间】:2012-05-14 13:36:35 【问题描述】:编辑:
从 DCoder 收到更多信息后,我在这里搜索的短语是“批量分配漏洞”。也就是说,利用将所有有效字段保存到数据库中的方法的便利性,而不管它们是否存在于初始表单上(使它们容易受到包含比预期字段更多[可能更关键]字段的操纵 POST 数据的攻击)。
然后将这两个常见的响应适当地命名为白名单和黑名单;将用于修改的字段列入白名单,或将不应修改的字段列入黑名单。
然后我的问题是:Cakephp 是否会自动将提交表单中的那些字段列入白名单,还是我(和其他 Cake 粉丝)有必要小心我们适当地列入白名单或列入黑名单?
原问题:
Cake 提供了许多很棒的方法来生成表单并几乎自动处理它们。当我在考虑安全性时,我想知道:Cake 是否知道提交的表单中存在哪些字段,或者它是否会简单地接受任何有效字段?如果我没有意义,请采取以下 senario(如果他们能想到更好的表达方式,欢迎有人编辑我的问题以更好地措辞):
假设我允许我的用户编辑他们的个人资料。我在edit
操作下创建了一个包含用户名、电子邮件和密码字段的表单。
一个聪明的用户想要进来并将他们的is_admin
字段从false
更改为true
,因此他们使用像firebug这样的应用程序将自定义帖子数据提交给edit
操作,其中包括字段@ 987654327@ 设置为true
。
问题是,Cake 会自己意识到is_admin
不是原始形式,还是我需要小心明确指定给定操作可以修改的唯一字段?有没有更简单的方法?
谢谢!
詹姆斯
【问题讨论】:
这被称为“批量分配”,最近它在used to "hack" GitHub 时成为头条新闻。通常对此的解决方案是将可以批量分配的字段。 @DCoder,谢谢,拥有真实姓名有很大帮助。我将修改问题以反映该信息。 【参考方案1】:您必须在控制器中加载SecurityComponent
,CakePHP 会为您防止表单篡改,请参阅http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#form-tampering-prevention
【讨论】:
我也建议你(xtraorange)阅读dereuromark.de/2010/09/21/saving-model-data-and-security 这很有帮助(你们俩)。 @mark - 我通读了这篇文章,发现它解决了我一直在考虑的所有问题(还有一个我没有考虑过的问题)。我注意到这篇文章有点过时了,我不确定你上次更新它的时间:此时你对安全组件有什么感觉?如果我要使用它,我还需要注意什么? 那么在 AppController 中包含安全组件会保护任何表单不被篡改吗?你知道这对性能造成的影响吗? 是的,安全组件会自动处理几乎所有的事情。性能几乎相同(与整体加载时间相比并不真正可见)。 @mark 如果使用安全组件,还有什么我需要注意和防止的(我知道 PKs 以前就是其中之一,但是自从你写这篇文章以来已经有几年了,所以我不确定发生了什么变化)。【参考方案2】:CakePHP 内置了可用的验证选项。表单会根据您在模型中提到的验证标准自动生成字段并进行验证。此验证将在 Save 方法之前自动调用。
此外,如果您想添加一些自定义验证,您可以在模型中添加它。
通过您的特定查询,您可以从编辑表单中删除 is_admin
字段,这样用户就无法对其进行编辑。如果您想增加更多安全性并确保 is_admin
字段具有 false 值,您可以在控制器编辑方法中编辑其值。
在编辑方法中,您可以在调用保存操作之前添加以下代码。$this->request->data['ModelName']['is_admin] = false;
【讨论】:
好吧,我不是在引用验证。我确实了解蛋糕验证,但我认为这不适用于这里。至于is_admin
,这只是一个例子。关键是我想知道用户是否想改变他们喜欢的任何东西,不管我是否打算改变它,对于他们有能力修改任何东西的任何模型。那我该如何预防呢?
您可以做的是在您不希望用户编辑的编辑页面中禁用该字段。即使您认为用户可能会使用 firebug 篡改数据,您也可以在控制器编辑操作中的 Save 方法之前重写原始数据。 $this->request->data['ModelName']['is_admin] = false;
不幸的是,这不是我可以全面应用的东西。如果我只关心一个领域,当然,特别是如果我知道它是预期的内容。但我正在研究基于建模示例的应用程序范围的场景;许多领域都有同样的问题,不同的用户级别具有不同的权限等等。也许指定一个例子有点令人困惑,我已经澄清了我的问题,希望这会有所帮助。感谢您的意见
我认为这不是处理这些问题的好方法。将允许的属性设置为白名单和/或使用安全组件(如其他答案所示)以上是关于CakePHP 在保存修改数据时会自动处理批量赋值漏洞吗?的主要内容,如果未能解决你的问题,请参考以下文章