簡體   English   中英

Cakephp獲取有關安全組件錯誤的詳細信息

[英]Cakephp get details about security component error

我在我的項目中使用安全組件,有沒有辦法在開發時獲得有關錯誤的詳細描述? 例如: - 如果在視圖中添加任何字段而不使用cakephp的form方法,則在blackHoleCallback函數中返回錯誤為'auth'。 相反,我需要因為它返回錯誤的原因。 因為它需要花費很多時間來糾正這個問題。 有沒有辦法得到詳細的錯誤描述?

您所要做的就是在正確的地方尋找

檢查您的app/tmp/logs/error.log文件

如果您查看錯誤日志,您將看到如下條目:

2013-03-16 17:24:29 Error: [BadRequestException] The request has been black-holed
#0 root/lib/Cake/Controller/Component/SecurityComponent.php(228): SecurityComponent->blackHole(Object(FacebookUsersController), 'csrf')
#1 [internal function]: SecurityComponent->startup(Object(FacebookUsersController))
#2 root/lib/Cake/Utility/ObjectCollection.php(130): call_user_func_array(Array, Array)
#3 [internal function]: ObjectCollection->trigger(Object(CakeEvent))
#4 root/lib/Cake/Event/CakeEventManager.php(246): call_user_func(Array, Object(CakeEvent))
#5 root/lib/Cake/Controller/Controller.php(670): CakeEventManager->dispatch(Object(CakeEvent))
#6 root/lib/Cake/Routing/Dispatcher.php(183): Controller->startupProcess()
#7 root/lib/Cake/Routing/Dispatcher.php(161): Dispatcher->_invoke(Object(FacebookUsersController), Object(CakeRequest), Object(CakeResponse))
#8 root/app/webroot/index.php(96): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#9 {main}

閱讀屏幕上的錯誤

如果處於調試模式,則錯誤發生時屏幕上也會顯示此錯誤。 例如:

The request has been black-holed
Error: The requested address '/admin/fooby/edit/1' was not found on this server.

Stack Trace
CORE/Cake/Controller/Component/SecurityComponent.php line 228 → SecurityComponent->blackHole(FacebookUsersController, string)
[internal function] → SecurityComponent->startup(FacebookUsersController)
CORE/Cake/Utility/ObjectCollection.php line 130 → call_user_func_array(array, array)
[internal function] → ObjectCollection->trigger(CakeEvent)
CORE/Cake/Event/CakeEventManager.php line 246 → call_user_func(array, CakeEvent)
CORE/Cake/Controller/Controller.php line 670 → CakeEventManager->dispatch(CakeEvent)
CORE/Cake/Routing/Dispatcher.php line 183 → Controller->startupProcess()
CORE/Cake/Routing/Dispatcher.php line 161 → Dispatcher->_invoke(FacebookUsersController, CakeRequest, CakeResponse)
APP/webroot/index.php line 96 → Dispatcher->dispatch(CakeRequest, CakeResponse)

處理csrf錯誤

通過特定錯誤的詳細信息 (即您發布的數據以及當時會話中的確切令牌數據),可以回答問題所帶來的問題,因為沒有錯誤:

看看拋出錯誤的那一行。

在上面的堆棧跟蹤中,錯誤來自CORE/Cake/Controller/Component/SecurityComponent.php line 228 - 打開文件並查看該代碼是什么:

if ($isPost && $isNotRequestAction && $this->csrfCheck) {
    if ($this->_validateCsrf($controller) === false) {
        return $this->blackHole($controller, 'csrf');
    }   
}

從中可以明顯看出,函數_validateCsrf負責請求被黑洞化。 這不應該是一個驚喜。

看看那個函數的來源:

protected function _validateCsrf(Controller $controller) {
    $token = $this->Session->read('_Token');
    $requestToken = $controller->request->data('_Token.key');
    if (isset($token['csrfTokens'][$requestToken]) && $token['csrfTokens'][$requestToken] >= time()) {
        if ($this->csrfUseOnce) {
            $this->Session->delete('_Token.csrfTokens.' . $requestToken);
        }
        return true;
    }
    return false;
}

根據該函數返回false的原因,確定繼續調試的方式。

正確配置組件

調試CSRF錯誤的必然結果是您需要修改安全組件配置

例如,您是否想要重復使用令牌,因為您的應用在頁面加載之間多次提交相同的表單?

您是否通過向表單數據添加新字段來自動使表單請求失效 - 您可以使用unlockedFields屬性從csrf檢查中排除這些字段。

您也可以完全禁用CSRF檢查 這有明顯的安全后果 - 但如果您正在努力使用該組件,那么這是一種簡單的解決方法,也是您目前遇到的問題。

為了查看我挖掘代碼的機制,看看如何創建FormHelper哈希以及SecurityComponent驗證如何檢查哈希。 以下是如何准確了解幕后發生的事情。

檢查FormHelper的輸入。 打開CORE / Cake / View / Helper / FormHelper.php。 在secure()函數中,在$ files = Security :: hash行周圍添加一些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行:

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

希望這可以幫助那些遇到鎖定/解鎖或丟失字段問題的人快速弄清楚蛋糕內部的情況。

還要記住,您必須在FormHelper生成的Token與使用Session檢索到的bu餅之間完全匹配。 正如文檔所說,當您動態生成輸入或進行ajax調用時,可能會發生不匹配:請記住序列化表單並通過ajax提交!

如果您生成的輸入標記不是使用FormHelper生成的,則必須解鎖。 例如在你的beforeFilter()

$this->Security->unlockedFields = 
                 array('MyModel.some_field1','MyModel.some_field2')

其中field1field2是“手動”生成的字段,即不使用Helper。

要回答這個問題:“有沒有辦法獲得詳細的錯誤描述?”

首先,在SecurityComponent中為控制器添加更有價值的調試。 這是一種方法:

public function beforeFilter() {
    parent::beforeFilter();

    //your beforeFilter code

    //Enable CSRF and other protections
    $this->Security->csrfExpires = '+1 hour';
    $this->Security->csrfUseOnce = true;
    $this->Security->blackHoleCallback = 'blackhole';
}

public function blackhole($errorType) {

    $errorMap['auth']   = 'form validation error, or a controller/action mismatch error.';
    $errorMap['csrf']   = 'CSRF error.';
    $errorMap['get']    = 'HTTP method restriction failure.';
    $errorMap['post']   = $errorMap['get'];
    $errorMap['put']    = $errorMap['get'];
    $errorMap['delete'] = $errorMap['get'];
    $errorMap['secure'] = 'SSL method restriction failure.';
    $errorMap['myMoreValuableErrorType']    = 'My custom and very ' . 
    'specific reason for the error type.';

    CakeLog::notice("Request to the '{$this->request->params['action']}' " . 
"endpoint was blackholed by SecurityComponent due to a {$errorMap[$errorType]}");
}

正如AD7six所提到的那樣看一下CORE/Cake/Controller/Component/SecurityComponent.php 特別是SecurityComponent::startup() 在該方法中,您將注意到SecurityComponent::blackhole()方法運行了幾次。 只要條件未通過安全檢查,它就會運行,如下所示:

return $this->blackHole($controller, 'auth');

在這種情況下,“auth”表示失敗的安全檢查類型。 您可以自定義'auth'字符串以獲得更多價值。 例如,使用'myMoreValuableErrorType'代替'auth',然后將其映射到更有意義的東西。

因此$this->blackHole($controller, 'auth')當安全檢查失敗時,不要運行$this->blackHole($controller, 'auth') ,而是運行$this->blackHole($controller, 'myMoreValuableErrorType') ,然后將'myMoreValuableErrorType'映射到特定原因為什么它失敗了使用上面的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM