5

コード内の 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 のバグ追跡システムにバグを送信しました。しかし、誰かが何かヒントを持っているなら、私はそれを聞きたいです.

4

3 に答える 3

2

ここでは、安全なコードと安全でないコードを区別するのは困難です。確かに、userInputfilterString安全でない可能性がありますが、コンパイル時にこれを判断することは不可能です。ただし、文字列連結内の単一引用符文字は、挿入可能なコードを使用していることの明らかな兆候です。そのため、FindBugs はこの文字を含む行でトリガーされますが、単なる文字列連結の行ではトリガーされません。

基本的に、これはバグではありませんが、SQL インジェクションをチェックするためにソフトウェアが実行できる制限です。文字列には何かが含まれている可能性があるため (つまり、別の関数に脆弱な連結がある可能性があるため)、問題が存在することをツールに確実に判断させることは不可能です。

于 2008-12-29T21:00:57.523 に答える
1

PMDCheckstyleもそれをキャッチするとは思いませんが、試してみてください(私は3つすべてを定期的に使用しており、使用するのに適したツールです)。

編集:PMDは正しいリンクでしたが、私はそれをfindbugsと呼びました...脳のfindbugsだと思います...

于 2009-03-07T16:46:09.967 に答える
0

http://www.ouncelabs.com/などの商用ソフトウェアにアップグレードすることを検討してください。

于 2009-04-18T00:49:17.823 に答える