2013-07-30 13 views
1

我有一个问题让安全组件验证发布的表单,并且它保持了黑帽操作。仔细研究代码,我发现哈希标记不匹配。用于验证表单的发布数据的CakePHP安全组件标记是不同的 - >黑洞

在发布的表单中,只有一个字段被验证(在Security :: _ validatePost中)被锁定。但是我在查找Form->创建令牌的生成方式和方法时遇到问题。

令牌不匹配的典型原因是什么?我应该在哪里检查蛋糕是如何生成令牌的['_Token'] ['fields']和? (使用蛋糕2.3.7)。该表单也使用ajax验证。

编辑:当我倾倒了从安全::的generateToken的$令牌值,它看起来像

阵列( [关键] => ddc88faacf41985f41359ff99d9c6f87549611c7 [allowedControllers] =>阵列 ( )

[allowedActions] => Array 
    (
    ) 

[unlockedFields] => Array 
    (
    ) 

[csrfTokens] => Array 
    (
     [f8c40609a0a86db23bfa5ea2d258723d3caff55a] => 1375207459 
     [084c3363363591c3024c59452899a2f4f60ecf99] => 1375207655 
     [0344c686c549927c1e27729ae95d879a4034bdab] => 1375207678 
     [dfb940ec034e82b10f7b3cc5677734da6896dfbc] => 1375207762 
     [ddc88faacf41985f41359ff99d9c6f87549611c7] => 1375207791 
    ) 

但是,对于创建的表单,表单发布时Security :: _ validatePost中的标记是

令牌= 6521bb362f8323e8f871814fc5d37a79c93e294e 检查= e8c40d174a23e8797d906d6e381a9a0acc1425ed

当令牌从

$check = $controller->request->data; 
$token = urldecode($check['_Token']['fields']); 

拍摄和检查后重新定义为:

$check = Security::hash(serialize($fieldList) . $unlocked . Configure::read('Security.salt'), 'sha1'); 

然后$令牌和$检查比较和错误哪些导致黑洞。

回答

4

我发现一个字段没有被添加到POSTED表单字段的列表中,因为它是一个未经检查的CHECKBOX(请参阅下面的编辑)。我想我会概述一个通用的调试程序,以帮助安全表单验证问题的人员。

为了查看我在代码中挖掘的机制,以查看FormHelper哈希如何被创建,以及SecurityComponent验证如何检查哈希。以下是如何确切了解幕后发生的情况。

检查FormHelper的输入。打开CORE/Cake/View/Helper/FormHelper.php。在安全()函数周围添加$文件的一些PR线=安全散列::线怎么看这个标记是内置:

pr($fields);//hashed into computed token on next line 
$fields = Security::hash(serialize($fields) . $unlocked . Configure::read('Security.salt'), 'sha1'); 
pr($unlocked); //hashed into computed token 
pr(Configure::read('Security.salt')); //hashed into computed token 
pr($fields); //computed token passed via hidden token field in form 

检查形式如何处理 立即检查如何提交的表单处理并与传递的令牌进行比较: 打开CORE/Cake/Controller/Component/SecurityComponent.php。插入在_validatePost()函数一些公关线底:

pr($fieldList); //hashed into computed token 
pr($unlocked); //hashed into computed token 
pr(Configure::read('Security.salt')); //hashed into computed token 
pr($token); //passed token from FormHelper 
pr($check); //computed token 

希望这有助于别人谁拥有锁定/解锁或丢失领域的问题很快弄清楚什么是你的蛋糕里面怎么回事。

编辑: 导致问题的领域是一个CHECKBOX。当它未被用户选择时,该字段不由POST动作提交。缺少的字段导致SecurityComponent失败。为了避免这种情况在复选框上添加到表格:

$this->Form->unlockField('checkbox.field.name'); 
0

您是否在视图中使用Javascript创建或删除了字段?你走了。 See also the book for the security component

如果你想使用它们,你必须列出这些字段。

+0

你如何列出它们?它似乎只是检查我认为是默认行为的ID。 (我编辑了我的问题以添加更多详细信息) – user6972

+0

我查看了安全配置设置,并且根据提交的字段,它似乎不是白名单问题。令牌不匹配。我可以在哪里找到问题的任何想法? – user6972