1

Java/jdbc コードの SQL ステートメントを検査して、実行される SQL が許容できる品質であることを確認したいと考えています。Findbugs ではない PMD には、JDBC または SQL ルールがないようです。p6spy を使用して SQL をログに記録し、その方法を確認することもできますが、これは手動です。

PMD/Findbugs/etc を使用して、「=」または「in」がある PreparedStatement に渡される文字列が比較側でパラメータ化された変数のみを持つというルールを作成する戦略かどうか疑問に思っています。

誰かがこれをしましたか?それとも他の方法でこれを行いましたか?

4

2 に答える 2

1

これは難しい問題です。=やのような比較演算子もありIN()ますが、次のようなものもあります != <> < <= > >= LIKE

アプリケーション変数を式のリテラルとして補間するケースをどのように見つけますか?

String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable";

文字列区切り文字を含む SQL を検索することはできますが、SQL インジェクションは文字列リテラルの補間だけから生じるわけではありません。

アプリケーション変数をデータ値以外のものとして補間するケースをどのように見つけますか?

String sql = "SELECT * FROM mytable ORDER BY " + columnname;

SQL インジェクションの欠陥を自動的に検出する方法がわかりません。コード レビューは、それらを見つけるためのより効果的な方法です。補間されたアプリケーション変数を含むすべての SQL ステートメントで、アプリケーション変数が「安全」であること、および危険なペイロードが含まれないようにアプリがそれらを明示的に検証または変換したことを確認する必要があります。

于 2008-12-04T22:24:29.587 に答える
0

接続されたデバッガーでアプリケーションを完全にテストできますか?

JDBC ドライバーの Connection.createStatement() の実装にブレークポイントを設定し、アプリを実行します... (または、ソース コードがないドライバーを使用している場合は、呼び出しを本物のドライバーに委任するだけの偽のドライバーを作成します) 、および createStatement() のすべてのインスタンスをログに記録します)

于 2009-06-04T13:39:06.153 に答える