SV.DATA.DB

このエラーは、未検証のユーザーデータが SQL データベースクエリに挿入される状況を検出します。このデータは、ユーザー入力からデータベースに直接保存され、悪意のあるコンテンツを含んでいる可能性があります。このデータが後で別の SQL 文に使用される場合には、SQL インジェクションの脆弱性も存在します。このデータが後で Web インターフェイスへの出力に使用される場合には、クロスサイトスクリプティングの脆弱性も存在します。

脆弱性とリスク

データインジェクションの脆弱性は、悪意のあるコンテンツを保存する余地をアプリケーションに与えます。この脆弱性は、ユーザー入力が直接、未検証のままアプリケーションのデータベースに保存されることによって生じます。このデータには悪意のある HTML コンテンツ、SQL 文、操作されたパスなどが含まれる可能性があり、これらが後でアプリケーションに使用される可能性があります。たとえば、このデータが Web インターフェイスに反映される場合、データインジェクションがクロスサイトスクリプティングにつながる可能性があります。

Klocwork セキュリティ脆弱性 (SV) チェッカーは、潜在的に危険なデータを生成する呼び出しを特定します。このような呼び出しは安全でないソースと考えられます。ユーザーは攻撃者になる可能性があり、ヒューマンエラーを取り込む可能性があるため、安全でないソースはユーザーが指定した任意のデータである可能性があります。

軽減と防止

データインジェクション攻撃は、アプリケーションの外部からのあらゆる入力 (ユーザー入力、ファイル入力、システムパラメーターなど) を検証することで防止できます。検証には、長さと内容を含める必要があります。データベースに保存するすべてのデータには、特定のタイプ (ユーザー名など) に対する語彙的なチェックを含める必要があります。通常、英数字文字 (A ~ Z、a ~ z、0 ~ 9) のみが必要とされます。受け取ったその他の文字はすべてエスケープする必要があります。この検証は、各パラメーターを HTTP 要求から読み取った場合などに、データのソースごとに実行する必要があります。また、SQL 文で使用されるすべての文字列を、その使用前にチェックすることが推奨されます。

例 1

コピー
     public void setUserLastName(ServletRequest req, Connection con) throws SQLException {
         // Source of data from HTTP request in servlet
         String lastName = req.getParameter("lastName");
         int userId = Integer.parseInt(req.getParameter("userId"));
 
         String query = "UPDATE userData INTO lastName=? WHERE userid = ?";
         PreparedStatement statement = con.prepareStatement(query);
         statement.setString(1, lastName);
         statement.setInt(2, userId);
         statement.executeUpdate();
     }

SV.DATA.DB が 21 行目に対して報告されています。'lastName' は HTTP 要求から値を取得するため、汚染される可能性があります (14 行目)。19 行目で汚染された 'lastName' が SQL 文 'statement' の作成に使用され、この SQL 文が 21 行目で実行されています。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。