让我们想象输入的位置如下:
<input name="x" />
<input name="y" />
<input name="z" />
如果手动用户可以造成任何伤害,例如,使用FireBug创建更多具有不同名称的输入吗?
我问这个是因为我的团队昨天创建了一条规则,你需要手动过滤$_POST
数组(例如),以确保其中只有预期的密钥。我个人认为,如果有额外的密钥,例如foo
和bar
,则不会有任何损害。他们会被忽略,对吗?
此外,我们正在使用Kohana 3.0及其ORM。也许这就是重点?也许ORM会对额外的,不需要的密钥做出不同的反应,如果“黑客”猜到“错误的”密钥(也是列也是如此),可能会更新数据库中的意外列?
您怎么看?
答案 0 :(得分:3)
这是一些像Ruby on Rails和ASP.NET MVC这样的框架中的问题,它可以作为批量分配出现。
考虑一个用户帐户模型,其中包含用户名,密码,电子邮件,然后是用户是否为admin的布尔标志。 您构建了一个允许自行注册的表单,并且因为您当然不希望用户允许自己成为管理员,所以您只包含表单中的三个第一个字段。但是在这些框架中(除非您禁用它),将分配具有特定名称的任何表单字段(无论它们是否来自实际表单)。因此,如果攻击者添加了一个名为user [admin] = 1的字段,那可能由“魔术”后端分配,并且实际上对数据产生影响,即使您从未明确地处理过该变量。
答案 1 :(得分:2)
Erlend是正确的,如果你只是将$_POST
放入ORM然后你可能会遇到安全问题,但他对Kohana是错的。使用Kohana 3. *以后,ORM方法values()
采用第二个参数,这是一个预期键的数组。
所以,以下示例
$user = ORM::factory('user');
$user->values($_POST, array('username', 'password')
$save->save();
只会使用数组中的用户名和密码字段。
答案 2 :(得分:1)
如果您正在使用某种将所有POST变量转换为SQL查询的自动化,则声明可能存在某些内容。我不知道Kohana做了什么,但是有些框架有一个save_to_database( $data )
函数可以从$data
中选择包含表中相应字段的变量,所以理论上攻击者可能能够保存更多数据通过发送额外的密钥,他们应该通过数据库。 (大多数框架还允许将一组允许的字段传递给阻止此类攻击的函数。)