java jdbcコードでパラメータ化されていないSQLを検出するツール
-
19-08-2019 - |
質問
実行されるSQLが許容可能な品質であることを確認するために、Java / jdbcコードのSQLステートメントを調べたいと思っています。 FindbugsではなくPMDには、JDBCまたはsqlルールがないようです。 p6spyを使用してSQLをログに記録し、そのように見ることができますが、これは手動です。
PMD / Findbugs / etcを使用して、任意の文字列が<!> quot; = <!> quot;または<!> quot; in <!> quot;比較側にパラメータ化された変数のみがあります。
これを行った人はいますか?または、他の方法でこれを行いましたか?
解決
これは難しい問題です。 =
やIN()
などの比較演算子はいくつかのケースですが、!= <> < <= > >= LIKE
もあります。
式のリテラルとしてアプリケーション変数を補間するケースをどのように見つけますか?
String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable";
文字列の区切り文字を含むSQLを検索できますが、SQLインジェクションは文字列リテラルの補間からのみではありません。
アプリケーション変数をデータ値以外のものとして補間するケースをどのように見つけますか?
String sql = "SELECT * FROM mytable ORDER BY " + columnname;
SQLインジェクションの欠陥を自動的に検出する方法を知りません。コードレビューは、それらを見つけるより効果的な方法です。補間されたアプリケーション変数を含むすべてのSQLステートメントでは、アプリケーション変数が<!> quot; safe <!> quot;であることを確認する必要があります。アプリがそれらを明示的に検証または変換して、危険なペイロードが含まれないようにしていること。
他のヒント
デバッガを接続した状態でアプリケーションを完全にテストする機能はありますか?
JDBCドライバーのConnection.createStatement()の実装にブレークポイントを設定し、アプリを実行します...(または、ソースコードがないドライバーを使用している場合は、呼び出しを委任するだけの偽のドライバーを記述します実際のものであり、createStatement())のすべてのインスタンスを記録します