Ajax(XMLHttpRequest)のセキュリティー

Ajaxが広く普及する以前は、クリックによるウェブサーバの反応は画面全体の再描画を必要とするものがほとんどでした。当時のJavaScriptによるサーバリクエストは、すなわちこのプログラムの終了を意味するに等しいもので、この状況を打破すべく登場したのがJavaScriptの非同期通信を可能にするXMLHttpRequestオブジェクトです。この基幹技術がページの変遷なしにデータの送受信ができるAjaxの誕生のきっかけになったという訳なのです。

マッシュアップタイプ

Ajaxの普及によって今度は、ウェブ上に公開されている様々なデータを加工するマッシュアップタイプのWebアプリケーションを構築するケースが増加し、それに伴って外部とのやりとりによるリスクも大きくなりました。

もともとXMLHttpRequestは、自分のWebサーバのみにしかリクエストを送ることが出来なかったのですが(同一生成元ポリシーの制限)、これを使わずJSONPなどの方法によってクロスドメインによる非同期通信が行われるようになって行きました。2009年ごろからXMLHttpRequestレベル2が各ブラウザでサポートされ、事実上解禁状態になったようです。

そのような訳で、Ajaxアプリケーションに悪意のスクリプトが侵入する機会も増えました。従来、サーバ側の設定不備などによって発生することが多かったスクリプト侵入ですが、サードパーティーから取り込んだJavaScriptプログラムやAPI呼び出しなどの際がこれに該当します。

クロスサイトスクリプティング(XSS)

いわゆるクロスサイトスクリプティング(XSS)には、ウェブアプリケーション側に問題がある反射型(非持続)と格納型(持続型とも)、これに対してユーザー側のブラウザなどに問題があるDOMベース型があります。いずれも悪意のあるスクリプトが侵入した状態のウェブページを生成してしまうことが原因です。

また、格納型は攻撃者がサーバー側にプログラムを保存するもので、ユーザーに不正クリックさせる必要がありません。反射型は、保存を行わず、第三者にスクリプトを送信させるものを言います。DOMベースも反射型と同じくURLなどを介して不正スクリプトを注入しますが、正常なコードに悪意のあるスクリプトが注入されるものを指します。防止策は、HTMLの出力の際に「'」「"」「&」「<」「>」をエスケープします。

SQLインジェクション

SQLインジェクションは、アプリケーションのエスケープ不備をつかれて、想定外のSQL文を実行させられるもので、データベースにおいて不正操作を展開させられる攻撃です。原因は適切な処理がされてないフォームなどで悪意のコードを埋め込まれて発生します。防止策は、入力値を適切にエスケープします。