クロスサイトスクリプティング
クロスサイトスクリプティングの例
ごく簡単なケースとして、ユーザがフォームのテキスト ボックスに文字列を入力して送信すると、その文字列を含む HTMLページを返す Webアプリケーションを例に紹介します。
ここで、テキスト ボックスに次の文字列を入力して送信したとします。

アプリケーションで入力データをチェックしていない場合、出力された Web ページにスクリプトがそのまま含まれるため、次のようなダイアログが表示されます。

この例では、スクリプトは単にメッセージボックスを表示するだけですが、攻撃者は悪意のあるスクリプトを使用して、Cookie 情報の詐取、偽のページの表示、第三者へのフォーム情報の送信など、さまざまな操作を行うことができます。
ユーザに悪意のあるスクリプトを実行させるため、攻撃者はパラメータに細工を施した URL リンクを含む HTML ページや電子メールをユーザに閲覧させ、リンクをクリックするように仕向けます。
次のリンクをクリックすると、フォームのテキスト ボックスにスクリプトを入力して送信ボタンをクリックした場合と同じリクエストがアプリケーションに送信されます。

このアプリケーションではユーザーがログイン画面に入力したユーザー名を画面に出力します。
スクリプトとしては、一般的に JavaScript が多く使用されますが、ユーザのブラウザでサポートされているスクリプト言語であれば、言語を問いません。
クロスサイトスクリプティングの対策
コーディングによる対策
クロスサイトスクリプティング (XSS) を防ぐには、ユーザからの入力データの検証と、出力データの適切なエンコーディングを徹底します。例えば、これらをコーディング規約として定義すること、コードレビューの観点に追加することが想定されます。
- 入力データを表示する前に、データの長さ、型、構文の安全性を検証する
- 出力データは HTML、XML などの出力フォーマットに従ってエンコードする
ただし、このような対策を行ったとしても大規模なアプリケーションで複数のクラス・メソッドにまたがるソースコードに潜む全て問題を従来の目視レビューだけで発見するのは不可能に近いとも言えます。
そこで、静的解析ツールでコードレビューを自動化して機械的にソースコードの問題を検出するようにします。
静的解析ツールJtestでクロスサイトスクリプティングを検出する
Parasoft Jtest にはクロスサイトスクリプティング(XSS)が発生するコードを検出する静的解析ルールがあります。- XSS の脆弱性の可能性から防御する [BD.SECURITY.TDXSS]
検出例 - Jtest 解析結果とソースコード:

このコードではユーザーがアプリケーションの外部から入力したユーザー名を画面表示するためのレスポンスデータを生成しています。
入力されたデータが不正なコードである場合、ユーザーの画面ではアプリケーションが意図しないスクリプトが実行されます。
偽のページが表示され、別の場所にリダイレクトされたり、ユーザーにデータの入力を促してアカウント情報の取得、ブラウザに保存されている Cookie 情報が取得されたりします。
修正例 - ソースコード:
ユーザーが入力したデータを使用する前に検証します。

入力されたデータに対して、文字列長のチェックやHTMLタグの属性値等に相当する全ての出力要素にエスケープ処理を行うvalidate() メソッドを経由させることでレスポンスには安全なデータだけが含まれるようにします。
Jtest の 「XSS の脆弱性の可能性から防御する [BD.SECURITY.TDXSS]」ルールでソースコードを解析することにより、 クロスサイトスクリプティング(XSS) 攻撃に対して脆弱なコードを発見し、改修することが可能になります。
Jtestが検出する脆弱性(抜粋)一覧
- クロスサイトスクリプティング(XSS) (本ページ)
- SQLインジェクション
- HTTPレスポンス分割
- さまざまなリソースインジェクション
※ 本ページでご紹介した「XSS の脆弱性の可能性から防御する [BD.SECURITY.TDXSS]」ルールを含むセキュリティルール及びセキュリティコンプライアンス規約セットによる静的解析には「セキュリティコンプライアンスパック」のライセンス(有償)が必要です。
イベント・セミナー
Java対応静的解析・単体テストツール Jtestに
関するお問い合わせ
テクマトリックス株式会社
東京本社ソフトウェアエンジニアリング事業部
03-4405-7853
- メールでのお問い合わせ
- parasoft-info@techmatrix.co.jp