2013-07-30 38 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