【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

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

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

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

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

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

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【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

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
2
読み込み中...
2 票, 平均: 1.00 / 12
6,483
X facebook はてなブックマーク pocket
【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author

長谷竜弥

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

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

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

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