[CakePHP2.x] 使用安全组件时出现问题 [black-holed]

这是开发团队的 Hase。

在 CakePHP 中使用 Security 组件实现登录功能时
遇到了这个神秘的错误

该请求已被搁置。

黑洞?这是什么?
这种情况尤其容易发生在你提交表单后点击浏览器“后退”按钮,然后再提交一次表单的时候。

作为一个完全的新手,我不明白这个错误是什么意思,所以我
决定查一下如何解决它。

允许 POST 和 Ajax

由于表单屏幕上几乎到处都有错误,
我添加了一个 `beforeFilter` 来允许 POST 请求,顺便也允许 Ajax 请求。

app/Controller/AppController.php

public function beforeFilter() { $this->Security->validatePost = false; $this->Security->csrfCheck = false; ... // ~执行一些处理~ }

我再次检查了一遍
,但错误依然存在。于是,
我又开始着手调查。

修复覆盖

AppController.php中允许 POST 和 Ajax 操作
导致 Controller 覆盖了 beforeFilter,
从而导致通信权限被移除。

因此,我修复了导致黑洞错误的控制器。
在 beforefilter 中parent::beforeFilter();。

app/Controller/UserController.php

public function beforeFilter() { parent::beforeFilter(); // ~一些处理~ }

我以为错误已经消失了,
但当我再次检查时,同样的错误又出现了。

处理黑洞回调

我已经做到这一步了,但是官方网站上有关于如何处理这个问题的说明。

当受到安全组件的限制时,默认情况下会返回 400 错误并将请求视为无效而丢弃。
您可以通过在控制器中将回调函数设置为 `$this->Security->blackHoleCallback` 来更改此行为。

换句话说,表单后,再返回浏览器重新提交,这提交
是一个无效请求,因此
返回了 400 错误,并且发生了黑洞错误。

我应该一开始就查看官方网站的。

因此,我修改了导致黑洞错误的控制器的前置过滤器,具体如下:

public function beforeFilter() { parent::beforeFilter(); $this->Security->blackHoleCallback = 'blackhole'; $this->Security->validatePost = false; $this->Security->csrfCheck = false; // ~ 一些处理 ~ } // 让黑洞通过 public function blackhole($type) { }

黑洞般的错误消失了!!
真是松了一口气。

参考

https://book.cakephp.org/2.0/ja/core-libraries/components/security-component.html
http://www.aipacommander.com/entry/2015/04/27/180000

如果您觉得这篇文章对您有帮助,请点个“赞”!
3
加载中...
3票,平均分:1.00/13
7,805
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

长谷达也

应届毕业生加入 Beyond Co., Ltd.。

我们开发网络系统(开发基于浏览器的服务和系统,例如网络服务、数字内容和业务管理系统)和游戏 API(开发用于与应用程序游戏通信的程序)。

我们也为 Shopify 开发私有/定制应用程序。

最初在大阪办公室工作,2019 年调到横滨办公室。
爱好:棒球、卡拉OK、动漫。