concrete5 で作ったページを iframe で呼び出し可能にしたかったので、以下のような作業を行いました。concrete5のバージョンは5.7.5.9です。
デフォルトの設定を確認する
デフォルトでは、concrete5 で作ったページを iframe で表示したい場合、同一ドメイン内からのみ許可しています。
chromeで確認してみると、下記のようになります。
この設定により、クリックジャッキングと呼ばれる攻撃を防いでいます。
クリックジャッキングについて
クリックジャッキングとは、罠ページ(A)に、誤操作させたいページ(B)を重ね合わせて、ユーザーが意図していない操作を行わせる攻撃方法です。
- 誤操作させたいページ(B)を透明にした状態で罠ページ(A)に重ねて表示する
- ユーザーが罠ページ(A)でクリックなどの操作を行う
- 実際には、誤操作させたいページ(B)で操作をしたことになる
というものです。詳しくは https://www.ipa.go.jp/files/000026478.pdf をごらんください。
クリックジャッキングを防ぐ
クリックジャッキングを防ぐには、外部ページに埋め込みされた場合に表示しないようにすれば良いです。上の 1. の状態が発生しないようにするわけです。
そのためには、x_frame_optionsを設定します。
- DENY - 一切不可
- SAMEORIGIN - 同一ドメインから許可
- ALLOW-FROM uri - 指定したドメインから許可
concrete5ではデフォルトで SAMEORIGIN になっています。
x_frame_options の設定を変更する
concrete5では、application/config/concrete.phpファイルで、設定を行うことができます。(このファイルが存在しない場合は作成してください。)
x_frame_options を設定しないようにする場合は、下記のようになります。
'security' => array(
'x_frame_options' => false,
),
詳しくは http://concrete5-japan.org/help/5-7/recipes/config/ をごらんください。
この設定をすると、iframe呼び出しが可能になります。
※追記 concrete5 ver.8.4では下記のようになります。
'security' => array(
'misc' => array(
'x_frame_options' => false,
),
),
特定のページ(群)を許可する
上の設定だと、ウェブサイトの全てのページでクリックジャッキング防止設定が無くなります。これだと、ログインページなどもクリックジャッキング防止設定が無くなります。さすがにまずいですね。
なので、ページを表示するときに、ページに応じてヘッダー出力を変更するようにします。
concrete5には、ページを表示するときに発火するイベントが用意されています。
public function on_start() {
Events::addListener('on_page_view', array($this,'on_page_view'));
}
public function on_page_view()
{
$c = Page::getCurrentPage();
if (mb_substr($c->getCollectionPath(),0,11) != '/estimation' ) {
header("X-Frame-Options: DENY");
}
}
このようなコードを書くと、iframeを許可するページ、iframeを許可しないページを作ることができます。上の例では、「ページのURLが/estimationで始まる場合のみiframeを許可する」にしています。
こうすることで、
マイミツ ログインページ はiframeを許可しない
見積フォームのサンプル はiframeを許可する
という設定ができました。
埋め込み表示の例はホームページへの埋め込みを許可しました。 :: 見積書作成時間を削減する「マイ見積」をご覧ください。