コード内の SQL インジェクションの脆弱性を見つけるのに役立つことを期待して、Eclipse 用の FindBugs プラグインをインストールしました。しかし、わざと入れても、何も見つからないようです。
次の例では、想定staticFinalBaseQuery
は次のように宣言されています。
public static final String staticFinalBaseQuery = "SELECT foo FROM table where id = '";
そして、assumeuserInputfilterString
は、サンプル スニペットをラップするメソッドへの引数です。ユーザー入力から直接取得され、サニタイズされません。
たとえば、次のスニペットは警告をトリガーしません。
String query = staticFinalBaseQuery + userInputfilterString;
pstmt = dbConnection.prepareStatement(query);
は静的staticFinalBaseQuery
な最終文字列でありuserInputfilterString
、ユーザー入力から直接の文字列であり、実行時にのみ使用可能であり、まったくスクラブされていません。明らかに、これは脆弱性です。
「準備されたステートメントが非定数文字列から生成されました」という警告がトリガーされることを期待しています。
次のスニペットでも警告は発生しません (これらのコンパイルされた形式はおそらく同じであるため、驚くことではありません)。
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString);
ただし、これにより警告が発生します。
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString + "'");
空の文字列またはスペースを追加しても、警告はトリガーされません。
私の質問は、最初の例で FindBugs をトリガーするにはどうすればよいですか? また、最初の警告が発生しないのに、最後の警告が発生するのはなぜですか?
前もって感謝します!
編集:これはバグである可能性があるため、FindBugs のバグ追跡システムにバグを送信しました。しかし、誰かが何かヒントを持っているなら、私はそれを聞きたいです.