security - Cakephp 获取有关安全组件错误的详细信息

标签 security cakephp

我在我的项目中使用了安全组件,有什么方法可以在开发时获得有关错误的详细描述吗?例如:- 如果在没有使用 cakephp 的 form 方法的情况下在 View 中添加了任何字段,它会在我的 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}

阅读屏幕上的错误

如果您处于 Debug模式,则该错误也会在发生错误时显示在屏幕上。例如。:
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 错误

有了特定错误的详细信息(即您发布的数据,以及当时 session 中的确切 token 数据),就可以回答是什么问题将您带到这里,如果没有:

看看抛出错误的行。

在上面的堆栈跟踪中,错误来自 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 错误的必然结果是您需要修改 configuration of the Security component .

例如,您是否希望重复使用 token ,因为您的应用程序在页面加载之间多次提交相同的表单?

您是否通过向表单数据添加新字段来使表单请求自我无效 - 您可以使用 the unlockedFields property从 csrf 检查中排除这些字段。

您也可以简单地disable CSRF checks完全。这具有明显的安全后果 - 但如果您正在努力使用该组件,这是一种解决您当前面临的问题的简单方法。

关于security - Cakephp 获取有关安全组件错误的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15333470/

相关文章:

android - 如何在 Android 上安全地存储模数、公共(public)指数和私有(private)指数?

java - 如何在没有弹出窗口的情况下通过 JNLP 授予 java 小程序所有权限

Cakephp 选择具有相应值的数字列表

php - 使用虚拟字段对 cakephp 中的值求和

database - Cakephp 发现没有按预期工作

objective-c - 应用程序应如何向数据存储区进行身份验证?

security - 自定义 Glassfish 安全领域不起作用(无法找到 LoginModule)

php - CakePHP 无法链接模型中 2 个表中的数据

security - AES 与 Blowfish 文件加密

cakephp - Ubuntu 14.04 中 CakePHP shell 的问题