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 在保存修改数据时会自动处理批量赋值漏洞吗?的主要内容,如果未能解决你的问题,请参考以下文章

cakePHP - 有条件的保存,可以吗?

cakephp:使用保存方法,我想在数据没有变化时更新修改时间

在 MVC 中保存相关数据(cakephp)

如何同时批量修改多个word文档内容

thinkphp5修改器

织梦批量修改栏目的保存目录和文章命名规则