Web Application Development - SitePen

Ajax JavaScriptアプリケーションの普及にともない開発者には特にAjax関連のセキュリティへの理解が求められている。そこでSitePenにおいて公開されている文書Security in Ajaxに注目したい。Kris Zyp氏によって執筆されたドキュメントで、Ajax JavaScriptアプリケーションにおけるセキュリティがまとめられている。次の内容がまとめられており、Webアプリケーション開発や保守における資料として活用できる。

  • クライアント(ブラウザ)からのアクセスに対してどうやってサーバリソースを保護するか
  • ほかのサイトからのサーバへのアクセスをどうやって許可するか
  • クロスサイトWebサービスからどうやってウェブページを保護するか
  • JSONハイジャックにどう対処するか

Kris Zyp氏はまずWebアプリケーションの設計はクライアントサーバモデルが便利であるとしながらも、セキュリティに関してはクライアントサーバモデルで考えるよりも「クライアント代理サーバモデル (client-deputy-server model)」とみなした方がよく、クロスサイトリソースにアクセスするようなWebアプリケーションを開発するには同モデルへの理解が大切だと説明している。

多くのサーバではアクセスを制御する方法として手動の認証とクッキーを使った認証状態保持を実装している。これは適切な方法だが、これだけではクロスサイトリクエストフォージェリ(CSRFまたはXSRF)と呼ばれる攻撃を受ける可能性がある。これを防ぐ方法はいくつもあるが、同氏はダブルサブミッションクッキーを使って明示的に認証をおこなう手法(Explicit Token Validation)が効果的な方法であると説明し、Dojoを使った実装例を紹介している。

Dojoを使ったExplicit Token Validationの実装例 - Security in Ajaxより抜粋

これはJavaScriptを使ってクッキーの値を取り出してリクエストヘッダに付加するという手法。クライアント以外の他のサイトからのアクセスではJavaScriptを経由したクッキーへのアクセスができない。このためJavaScriptで付与されるヘッダが付与されていなかったり、付与されているヘッダの値をサーバでチェックして認証したクライアントからのアクセスかどうかを判断できる。簡単で効果的な方法だ。Dojoを使えば実装も簡単で済む。

CSRFへの対抗策としてRefererヘッダをチェックに使う方法もあるが、手軽な半面、回避する方法が多いことや、Refererヘッダが無効にされている場合には使えないという欠点もある。ほかの手軽な方法としてはHTTP Authenticationもあるがクッキーだけを使った場合と同様の脆弱性があり、やはりExplicit Token Validationを使った方が効果的だという。

JSONハイジャックへの対応例 - Security in Ajaxより抜粋

それ以外にもJSONハイジャックに関する説明や対策方法、逆にサーバリソースを他のサイトに公開したり、ウェブサイト自身でほかのサイトからのアクセスを制限する方法が紹介されている (Proxied、JSONP、Cross-Site XHR)。またクロスサイトリソースに安全にアクセスするための方法としてwindow.nameの手法が紹介されている点にも注目しておきたい。

SitePenはもともとDojoやDWRを紹介することを目的としたサイトだ。Security in Ajaxで対策方法としてDojoを活用した例が紹介されているのはそのためだが、一般的なセキュリティドキュメントとしてもよくまとまっている。Ajax JavaScriptを活用したWebアプリケーションやサイトを開発している場合には一度目を通しておきたい文書だ。