【问题标题】:CakePHP Security Component Can't be Called无法调用 CakePHP 安全组件
【发布时间】:2013-02-05 07:16:02
【问题描述】:

当我尝试在任何应用程序中调用“安全”组件时,我的网站的某些页面会崩溃。例如在 AppController 文件中,如果我将组件定义从

var $components = array('Auth','Session','Email');

到

var $components = array('Auth','Session','Email','Security');

我网站上依赖其他页面的 POST 数据的页面崩溃。我得到的只是一个空白屏幕。 在 \cake\libs\controller\components 目录中定义并存储了“security.php”。

关于导致此问题的原因或如何解决此问题的任何想法?

【问题讨论】:

  • 尝试将“Security”移动到 $components 数组的开头?

标签: php security cakephp controllers


【解决方案1】:

这就是 SecurityComponent 应该做的事情。

它通过向所有表单添加“令牌”来检查表单是否“有效”并且未被篡改(例如,有人使用 javascript 在表单中添加了额外的字段或值)来保护您的应用程序。

它还会检查发布的表单是否源自控制器和/或允许这样做的操作 (allowedControllers)

如果不满足要求,则会调用“blackHoleAction”来停止进一步的操作。

根据您使用的“var $components”,而不是“public $components”,它认为您正在运行 Cakephp 1.3,请参阅此处的 SecurityComponent 文档: http://book.cakephp.org/1.3/en/The-Manual/Core-Components/Security-Component.html

阅读有关 allowedControllers 和 allowedActions 的部分

您的脚本中的某处也可能出现不可见的错误,因为调试已禁用。要启用调试,请在 core.php 配置文件中将调试级别更改为 1 或 2;

app/Config/core.php 将调试级别设置为 2,使用此行:

Configure::write('debug', 2);

【讨论】:

  • 谢谢!我正在尝试将页面从 http 路由到 https 以进行 SSL 连接。 page(action) 在订单控制器中定义。因此,在book.cakephp.org/2.0/en/core-libraries/components/… 之后,我在 $components 和 beforeFilter() fxn 中添加了 'Security' if (isset($this->params['order'])) { $this->Security->blackHoleCallback = '强制SSL'; $this->Security->requireSecure(); } 和这个函数 function forceSSL() { $this->redirect('https://' . env('SERVER_NAME') . $this->here); } 顺便说一句,版本是 2.9
  • 这样做仍然会使“订单”控制器中定义的页面/操作崩溃,并且也不会被重定向到 https://。我错过了什么吗?
  • 我不确定你应该使用$this->params,它可能需要$this->request->params(可能是文档中的错误)。在所有情况下,如果您启用调试,它会给出任何错误吗?另外,你有没有试过放一个简单的 'die("helloworld");'在 forceSSL() 方法中检查它是否到达那里?在 beforeFilter() 的开头调试请求 debug($this->request); 也可能会提供一些线索
  • 最后,请编辑您的原始问题并包含您的“beforeFilter()”和“forceSSL()”操作的来源,以及来自 AppController 的安全组件配置跨度>
  • 再次感谢。我弄错了 cakephp 版本。它是 1.3。这是当前正在工作的功能 beforeFilter() { parent::beforeFilter(); $this->Auth->allowedActions = array('..list of my actions..'); $this->Security->validatePost=false; $this->Security->blackHoleCallback = 'forceSSL'; $this->Security->requireSecure('myAction 需要保护'); }// 函数结束 beforeFilter() 我取出了 if isset 条件,因为 beforeFilter fxn 首先定义了 allowedActions 并将 validatePost 设置为 false(这会关闭 CSRF)。虽然不是最佳的,但似乎工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 2013-04-02
相关资源
最近更新 更多