SV.XSS.DB
このエラーは、アプリケーションデータベースからのクロスサイトスクリプティングが検出された場合に報告されます。クロスサイトスクリプティングの脆弱性は、未検証のユーザー入力が Web インターフェイスに反映される場合に発生します。
脆弱性とリスク
XSS (クロスサイトスクリプティング) の脆弱性は、情報内の未検証のユーザー入力が Web インターフェイスで使用される情報に使用されることにより生じます。このデータには、HTML タグや SCRIPT タグなどの任意の内容が含まれる場合があります。この情報がシステムの別のユーザーに対して表示される場合、これらのスクリプトを使用して、ユーザーのセッションを操作したり、これらのスクリプトを別の Web サイトに誘導してフィッシング攻撃を実行することや、その他の悪意あるスクリプトコンテンツを実行することが可能となります。この脆弱性は、ユーザーが別のユーザーに情報を投稿できるような Web アプリケーションのメッセージボードで一般的に存在します。この内容を注意深く選別することにより、他のユーザーに表示される出力に HTML タグや SCRIPT タグが挿入されるのを防止する必要があります。
Klocwork セキュリティ脆弱性 (SV) チェッカーは、潜在的に危険なデータを生成する呼び出しを特定します。このような呼び出しは安全でないソースと考えられます。ユーザーは攻撃者になる可能性があり、ヒューマンエラーを取り込む可能性があるため、安全でないソースはユーザーが指定した任意のデータである可能性があります。
軽減と防止
通常、クロスサイトスクリプティングの脆弱性は、アプリケーションの外部からのあらゆる入力 (ユーザー入力、ファイル入力、システムパラメーターなど) を検証することで防止できます。検証には、長さと内容を含める必要があります。通常、英数字文字 (A ~ Z、a ~ z、0 ~ 9) のみが必要とされます。受け取ったその他の文字はすべてエスケープする必要があります。特に XSS の脆弱性に対応するには、ユーザー入力内のタグを許可しないようにする必要があります。この検証は、各パラメーターを HTTP 要求から読み取った場合などに、データのソースごとに実行する必要があります。検証はサーバー側で実行する必要があります。クライアントブラウザーでの必要性がなくとも、ユーザーが生の HTTP パケットを送信できるため、クライアント側での検証は XSS に対する保護として不十分です。
例 1
protected void printComment(Connection conn, ServletOutputStream out, String user) throws SQLException, IOException {
PreparedStatement pr = conn.prepareStatement("SELECT * FROM comms WHERE user = ?");
pr.setString(0, user);
String comment = pr.executeQuery().getString("comment");
out.println("Comments: " + comment);
}
SV.XSS.DB が 19 行目に対して報告されています。'comment' には、データベースから取得したデータが含まれます (18 行目)。この値は、19 行目で Web ページの表示に使用されます。すなわち、データベースに以前に保存された情報が未チェックで Web ページの表示に使用されることになります。この情報には、任意の HTML や JavaScript コンテンツが含まれる可能性があります。この脆弱性が利用される場合、データベースインジェクションの脆弱性も存在するはずです。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。