IEのサードパーティークッキー問題の対応をCakePHPで設定する場合

Facebookアプリなどを作っていると必ず遭遇し、セキュリティ的に問題だと揶揄されようともこれしか方法がない以上は避けて通れない「IEのサードパーティークッキー」の問題。iframe内に配置されたコンテンツがクロスドメインの場合(Facebookアプリの場合は必ずそうなってしまう)、そのコンテンツがCookieを保存・使用しようとしても許可されないというセキュリティ的な制限が掛けられている。

IEの設定を変更すれば当然この制限は緩和できるが、Facebookアプリ製作者が利用者のPCを1台1台回って設定変更するなんてことは不可能なので、コンテンツ側で制御するようにできなければ意味がない。ていうかそれができてしまうなら、制限そのものはほとんどセキュリティ的に意味をなさない気もするのだが、いわゆるP3P(Platform for Privacy Preferences)によって規定されている、ユーザエージェントが自動的に検索・解釈できる標準化形式により制御が可能となるようだ。詳しく調べている時間はないので、詳細は下記などに譲りたい(Google先生などで検索すれば大量に見つかるだろうし)。

■Platform for Privacy Preferences (P3P) Project – The World Wide Web Consortium (W3C)
http://www.w3.org/P3P/

■Platform for Privacy Preferences 1.0 (P3P1.0) 仕様書 – IAjapan
http://www.iajapan.org/trans2japanese/w3c/rec-p3p-20020416j.html

■WebにおけるP3Pとプライバシーに関するFAQ – NEW MEDIA DEVELOPMENT ASSOCIATION
http://www.nmda.or.jp/enc/privacy/w3cp3pfaqj.html

で、このポリシーの冗長度を低くしたコンピュータ可読性を高めた形式として、コンパクトポリシーなるものもあるらいし。

いくつかのサイトで以下をheaderで指定すればOKである、などと紹介されているものがあったのだが、どれもマチマチというか、指定するコンパクトポリシーの内容がバラバラであった。

[php]
header("P3P:CP=’IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT’");
header("P3P:CP=’UNI CUR OUR’");
[/php]

あまり詳細に追いかける暇もなく、さりとて単なるコピペで済ませるのも問題だろうということで、いくつか試してみた結果、究極的には以下のように設定してCookieが利用できることを確認した。

[php]
header("P3P: CP=”");
[/php]

CPの指定が空であってもCookieは設定できるようになった。
けれどこれだと本来のポリシー指定の意味から外れるはずなので、何らかのポリシー指定はしないと望ましくないのだろう。ということで、不勉強な上に時間もなくて後追いできないが、上記2行目のものを設定してみた。

[php]
header("P3P:CP=’UNI CUR OUR’");
[/php]

UNIは<uniqueid/>のコンパクト指定形式。どういうものかというと、こういうものである。

<uniqueid/>
ユニークな識別子: 個人を整合的に特定したり、認識するために発行された識別子。金融機関のID番号を除く。(政府発行の識別子を除く)。 これらはウェブサイトやサービスから発行された識別子を含む。

CURは<current/>のコンパクト指定形式。

<current/>
データが提供されている活動の遂行とサポート:情報は、情報提供や通信、双方向サービスなど、利用者が そのために情報を与えたところの活動を遂行するために、 サービス提供者によって利用されるかも しれない。例えば、ウェブ検索の結果の返信、電子メールの送信、商品の注文、または、申込サービスの提供など、繰り返し行う活動や、オンラインのアドレスブックや電子財布にアクセスを許可することなど。

OURは<ours>のコンパクト指定形式。

<ours>
当組織および/または当組織の業務委託先として業務を行っている法人または当社が業務委託先として業務をしている法人: この場合、 業務委託先(agent)とは、表明された目的の達成のためだけにサービス提供者に代わってデータ を処理する第三者として定義される。 (例えば、サービス提供者とその印刷事務所。ただし、 印刷事務所は住所ラベルを印刷し、それ以上は情報に関わりを持たない。)

おそらく専門家には怒られるのだろうけれど、この3つだけ指定してみた。こういうのは本当に難しい……。

おっと、肝心のCakePHPでの指定だけれど、私がハマッたのは、上記の指定をAPP/Views/Layouts/xxxxx.ctp に直接書いていて、これが有効にならなかった。何度IEで試してもCookieが参照できなかったのだ。
ウェブを見る限りでは「P3Pをヘッダ指定するだけでサクッとOK」などとどこでも書かれていて、それ以上の記述は見当たらない。これで半日を費やしてしまったのだが、APP/Controllers/XxxxxController.php のbeforeFilter()メソッド内にheader()関数を記述してようやくIEでもCookieが認識されるようになった。

[php]
function beforeFilter() {
header("P3P: CP=’UNI CUR OUR’");
}
[/php]

WebアプリケーションやFacebookアプリというのは、本当に悩ましいもので山積している気がする……みんなよく開発してるな……すごいっす。

速効!図解 インターネット&メール 総合版 Internet Explorer 9 & Windows Live Essentials 2011対応詳解CakePHP辞典―2.0/2.1/2.2/2.3対応即戦力になるための PHPシステム開発の教科書10日でおぼえるFacebookアプリ開発入門教室 (10日でおぼえるシリーズ)

コメントを残す

メールアドレスが公開されることはありません。