【问题标题】:Can extra, unneeded $_POST keys harm the system?额外的、不需要的 $_POST 密钥会损害系统吗?
【发布时间】:2011-08-16 07:14:58
【问题描述】:

让我们想象一下输入在哪里:

<input name="x" />
<input name="y" />
<input name="z" />

如果用户手动(例如,使用 FireBug 创建更多具有不同名称的输入)会有任何危害吗?

我问这个是因为我的团队昨天创建了一个规则,您需要手动过滤 $_POST 数组(例如)以确保其中只有预期的键。就我个人而言,如果有像foobar 这样的额外键,我认为不会有任何伤害。他们会被忽略,对吧?

此外,我们正在使用 Kohana 3.0 及其 ORM。也许这就是重点?也许 ORM 会对额外的、不需要的键做出不同的反应,并且如果“黑客”猜到“错误”键(也是列),也许会更新数据库中的意外列?

你怎么看?

【问题讨论】:

  • 发送什么密钥并不重要。由服务器来验证来自客户端的所有数据。如果某个魔法键被随机猜到(例如“godmode=1”)或者如果服务器因传递“意外值”而中断(例如 SQL 注入),则已经存在其他问题...
  • 我也是这么想的。但! ORM 和 Kohana ORM 呢?
  • 用户可能超过post_max_size并且$_POST的一部分可能会丢失

标签: php security kohana-3 kohana-orm


【解决方案1】:

这是一些框架中的一个问题,例如 Ruby on Rails 和 ASP.NET MVC,它可以作为批量分配发生。

考虑一个用户帐户模型,其中您有用户名、密码、电子邮件,然后是一个布尔标志,用于指示用户是否为管理员。 您构建了一个允许自行注册的表单,并且因为您当然不希望用户允许自己成为管理员,所以您只在表单中包含了前三个字段。但是在这些框架中(除非您禁用它),任何具有特定名称的表单字段(无论它们是否来自实际表单)都将被分配。因此,如果攻击者添加了一个名为 user[admin]=1 的字段,它可能由“魔术”后端分配,并且实际上会对数据产生影响,即使您从未明确处理过该变量。

【讨论】:

  • 我能想到的都是“设计破坏”:(
  • 在这两个框架中,您都可以限制可以设置的字段,使用该功能很重要。
【解决方案2】:

Erlend 是正确的,如果您只是将$_POST 放入 ORM,那么您可能会遇到安全问题,但他对 Kohana 的看法是错误的。从 Kohana 3.* 开始,ORM 方法 values() 采用第二个参数,它是预期键的数组。

那么,下面的例子

$user = ORM::factory('user');
$user->values($_POST, array('username', 'password')
$save->save();

Source code for values()

只会使用数组中的用户名和密码字段。

【讨论】:

  • 是的。我的团队在第二个参数还没有的 Kohana 3.0 上工作。所以我们只是扩展了 Kohana ORM 并自己创建它。
  • 我的错,我以为它在里面。你可以使用 Arr::extract 代替。
【解决方案3】:

如果您正在使用某种将所有 POST 变量转换为 SQL 查询的自动化,那么您的声明可能会有问题。我不知道 Kohana 做了什么,但有些框架有一个 save_to_database( $data ) 函数,可以从 $data 中选择在表中具有相应字段的变量,因此理论上攻击者可能能够将比他们更多的数据保存到数据库中'应该通过发送额外的密钥。 (大多数框架还允许将一组允许的字段传递给防止此类攻击的函数。)

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2014-06-18
    • 1970-01-01
    • 2020-12-14
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多