【導入実績300社以上】AWS 構築・運用保守サービス

【導入実績300社以上】AWS 構築・運用保守サービス

【サーバー管理不要】WordPress専用クラウド『WebSpeed』

【サーバー管理不要】WordPress専用クラウド『WebSpeed』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【コミュニケーションアプリ開発】LINE アプリ開発サービス

【コミュニケーションアプリ開発】LINE アプリ開発サービス

【ECサイト構築】Shopify カスタムアプリ開発サービス

【ECサイト構築】Shopify カスタムアプリ開発サービス

【音声アプリ開発】Twilio アプリ開発サービス

【音声アプリ開発】Twilio アプリ開発サービス

【グローバル対応】北米リージョン・クラウド / サーバー サポート

【グローバル対応】北米リージョン・クラウド / サーバー サポート

【CPU】AMD EPYC 技術検証(PoC)サービス

【CPU】AMD EPYC 技術検証(PoC)サービス

【Webシステム / サービス開発】SAKARAKU Lab(セカラクラボ)

【Webシステム / サービス開発】SAKARAKU Lab(セカラクラボ)

【取材記事】サーバー系企業ビヨンドが サーバーサイドエンジニアを募集中

【取材記事】サーバー系企業ビヨンドが サーバーサイドエンジニアを募集中

【対談記事】「やっぱクラウド移設っていいですよね」マイネット × ビヨンド エンジニア対談

【対談記事】「やっぱクラウド移設っていいですよね」マイネット × ビヨンド エンジニア対談

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【CakePHP2.x】Securityコンポーネントを使用したときの不具合【black-holed】

開発チームの長谷です。

CakePHPでログイン機能を実装するため、Securityコンポーネントを使用していたら、
こんな謎のエラーが発生しました。

The request has been black-holed

ブラックホール?なんだこれは。。
特にフォーム送信後にブラウザで「戻る」をして、もう一回送信したりすると発生する。。。

まだペーペーの自分にはこのエラーがどういったものか分からなかったので、
とりあえず解決方法を調べてみることにしました。

PostやAjaxを許可する

フォーム画面でほぼほぼエラーが出ていたので、
beforeFilterでPostとついでにAjaxを許可するようにしました。

app/Controller/AppController.php

public function beforeFilter() {

	$this->Security->validatePost = false;
	$this->Security->csrfCheck = false;
        
 ...
	// ~なんらかの処理~
	
}

これでエラーが発生しなくなったかなと少し期待しつつ確認をしましたが
やっぱり、同じエラーが発生していた。
再び調査開始。

オーバーライドしているのを修正

AppController.phpのbeforeFilterでPostとAjaxを許可したことによって、
ControllerがbeforeFilterをオーバーライドしてしまい、
通信の許可がなくなってしまったらしい。

なので、black-holeエラーが発生するControllerを修正。
beforefilterにparent::beforeFilter();を追加します。

app/Controller/UserController.php

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

	// ~なんらかの処理~
}

これでエラーが出なくなっただろうと思い、
確認してみましたが、再度同じエラーが発生。。

ブラックホールコールバックの処理

ここまできて何だが、公式サイトに対応方法が書いてありました。。

Security コンポーネントによって制限されている時、 デフォルトでは、不正なリクエストとして 400 エラーを返し破棄します。
コントローラ中のコールバック関数を $this->Security->blackHoleCallback に設定することによってこの振る舞いを変更できます。

つまり、フォーム送信後にブラウザで「戻る」をしてもう一度送信をするという行為が
不正なリクエストなので、
400エラーを返しblack-holedエラーが発生していたということになります。

最初から公式サイトを見ておけばよかった。。

というわけで、black-holeエラーが発生するControllerのbeforefilterを以下のように修正。

public function beforeFilter() {

	parent::beforeFilter();

	$this->Security->blackHoleCallback = 'blackhole';

	$this->Security->validatePost = false;
	$this->Security->csrfCheck = false;

	// ~なんらかの処理~
}

// ブラックホールをスルーする
public function blackhole($type) {
}

これで、black-holedエラーが出なくなりました!!
一安心。。

参考

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

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
3,673
facebook twitter はてなブックマーク

この記事をかいた人

About the author

長谷竜弥

新卒にて株式会社ビヨンドに入社。

Webシステム開発(Webサービス・デジタルコンテンツ・業務管理システム などのブラウザで動くサービス、システムの開発)や、ゲームAPI(アプリゲームとの通信部分のプログラム開発)を行っている。

また、Shopify のプライベート / カスタムアプリの開発も行っている。

元々は大阪オフィスに勤めていたが、2019年に横浜オフィスに転勤。
趣味は野球 / カラオケ / アニメ