金利0無利息キャッシング – キャッシングできます

 | 

2010-02-22

XHR level 2とJSONPとcrossdomain.xmlの話

22:35 | XHR level 2とJSONPとcrossdomain.xmlの話 - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - XHR level 2とJSONPとcrossdomain.xmlの話 - 金利0無利息キャッシング – キャッシングできます

XHR level 2ではクロスドメインXHRがサポートされる、で、FirefoxとかChromeとかSafariの最新版だと既に普通に使えるようになっている。

HTTPヘッダで Access-Control-Allow-Originを指定することで特定ドメインからの読み込みを許可することが出来る。*だと全部許可になる。

今までJSONPを使っていたAPIは、実質的に全てのドメインからアクセスを許可してる状態なので、HTTPヘッダに Access-Control-Allow-Origin: * を追加してやるといいんじゃないでしょうか。

JSONPscriptタグを動的に生成してdocumentに追加するという方式なので、もしJSONP APIの提供元がevilなscriptを配信していた場合、呼び出し元はそれを検知することが出来ない。クロスドメインXHR + JSON.parse(evalしないようにする)の組み合わせなら、ドメインを乗っ取られたり経路で改竄されたりしても、scriptの混入の危険が無いので、安心してAPIを利用することが出来る。あとはDOMノード追加するコストよりXHRの方が速そうだし、JSONではないデータをやり取りしたりとか、そういうメリットもあるだろう。外部ドメインからJSONPAPIを利用するライブラリを作る場合、ブラウザのバージョンが古いならクロスドメインのリクエスト投げる前にエラーになるだろうから、XHR level2を試行した後、JSONPでの取得を試みるとかの方が良いかなー、と思ってたりします。

crossdomain.xmlの話

この前Shibuya.jsの会合でamachangが「既にcrossdomain.xmlが普及してるから使えばいいんじゃないの」的なことを言ってて、それに対してセキュリティ上色々問題あるよという話をした。

仮にXHR level 2のクロスドメインアクセスポリシーがcrossdomain.xmlを使っていたらという話。

  • 自由にFlashを置ける権限と自由にJavaScript書ける権限ではポリシーが違う。
    • Flashは置けないけど自由にJSが書けるドメインから予期せずにデータを参照される危険がある。
  • DNS Rebindingの類の攻撃に対して脆弱になりやすい、安全な実装が難しい
    • evil.example.com/crossdomain.xmlを全許可の状態で配信した後、evil.example.comが別のIPアドレスを指すように変更する → アクセス制限突破できる
    • 全許可の状態のcrossdomain.xmlをキャッシュさせてしまえば、後はやり放題なので宜しくない。
    • 攻撃を防ぐために、crossdomain.xmlはキャッシュしない、リクエスト発行する直前に再取得するような実装になってたら転送量の無駄になる。
  • 現状のFlash Playerの実装も安全ではないと思われる(良く知らない)

そんなわけなんでリクエスト前にポリシーファイルを取得するのは冗長だったり安全に実装するのが難しかったりするのでHTTPヘッダ使うのが楽なのだろうなーと思いました。許可されてるかどうか分からないうちにとりあえずリクエストを投げちゃうのが気持ち悪いといえば気持ち悪いけど、それはimgタグとかでも可能なので。

それよりIE8がわざわざ別のXDomainRequestを作った理由が良く分からない、クロスドメインサポートしてるか判別しやすくするため?それなりに意味があるのだと思うけど、独自実装はなるべく使いたくないですね。

s-askas-aska2010/11/13 11:55hidden要素のvalue属性に値を入れて取り出すという方法だと安全という事はないでしょうか、いかがでしょうか。

malamala2010/11/13 13:25js側で生の値が必要な場合はそうです。が、js側でエスケープ済みかどうかを意識する必要があります。画面出力したりevalしたりするのであれば安全ではないです。本文に追記しました。

 |