クロスドメインでのデータ読み込みを防止するJavaScript ?
GMailのコンタクトリスト漏洩のエントリのついでに。
JSONデータをscriptタグにのせて配信するサービス(JSONPなど)で、限られたサイトのみにしかそのデータを配信しないようにするためには、クライアントが送出してくるリファラ情報を使ってサービスコンシューマとなっているサイトを特定してアクセス制御する方法がある。
この方法はおそらく大部分のクライアント(ブラウザ)に対しては有効で、例えば実際にGoogle MapsなどもそれとAppKeyを組み合わせてサイトを判別しているっぽいのだけど、意図的にリファラ送出を切っているブラウザであったり、あるいはプロキシプログラムなどが自動的にリファラヘッダを除去してしまうようなクライアント環境に対しては無効になってしまう。
ということで、そんなクライアントでもなんとかならないだろうかと考えていたときにちょっと思いついた、もしかしたらこの方法なら許可されていないサイトからのデータ読み込み(というより「利用」)を防ぐことが出来るかも?(ただしugly hack)
scriptタグ読み込みで送られてくるJavaScriptがこんな形になっているとする
callback( window.location.hostname=='www.example.com' ? { /* JSON data is here */ } : { error : 'Request not allowed from your site!' } )
これならwww.example.comにscriptタグを呼び出したHTMLが置いてない限り{ /* JSON data is here */ }の部分のJSONデータはアクセスできないよね? つまりJSONデータの「読み込み」はできても、外部の他のスクリプトから「利用」はできないということになる。
何か穴あるかな?方法が方法なんで、別にあってもおかしくはないけど、まだ見つからない。
ちなみに最初考えついたのは、
callback( window.location.href.indexOf('http://www.example.com')==0 ? { /* JSON data is here */ } : { error : 'Request not allowed from your site!' } )
だったけど、これは呼び出す元のHTMLであらかじめ
String.prototype.indexOf = function() { return 0 }
みたいなのを作ってしまえば回避できてしまう。
ということで上記のような形になりました。
JavaScriptは演算子オーバロード出来なかったよね?確か。