5

私たちのチームは、OWASPガイドラインへの準拠を強化することを目指しており、タスクの1つはSQLインジェクション攻撃の防止です。これを容易にするために、コードベースでの使用状況を自動的にチェックする方法を探していました。java.sql.Statementこれにより、フラグを付けて、を使用するように変更できますPreparedStatement

ビルドプロセスはMavenに基づいており、プロジェクトで分析を実行するためのSonarセットアップもあります。特定のしきい値に達した場合にビルドを失敗させるためのいくつかのルールがSonarにすでに設定されているため、ここで実装できます。インポートを探すcheckstyleregexルールを設定できる場所を見てきましたが、他のオプションもあるかどうかを確認したいと思いました。

開発/ビルドパスに沿った任意の場所が機能します。これにフラグを立てる何かがintellijにある場合、Mavenビルドプロセスに何かがある場合、またはSonarでこれにフラグを立てる別の方法がある場合、これらのいずれも問題ありません。

ありがとう!!

4

3 に答える 3

1

私はそれを使用していませんが、PMDはこれに適したツールのようです。

于 2012-01-16T16:29:49.120 に答える
0

クラスの使用を検出する代わりに、java.sql.Connectionプロキシを使用してそれらの生成を検出できますか? 工場から接続を取得したら、プロキシでラップします。プロキシは、メソッド呼び出し、クエリ文字列のログ、および/createStatement()または他の制限外呼び出しを使用している場合のスタック トレースのレポートを実行できるように設定されます。

public class ProxyConnection implements Connection {
    private Connection realConnection;

    public ProxyConnection(Connection realConnection) {
        this.realConnection = realConnection;
    }

    public Statement createStatement() throws SQLException {
       // could the offenders
       createCounter.incrementAndGet();
       // log the callers -- expensive so maybe every 100th or every 10 secs
       logger.info("call to createStatment", new Exception("createStatement"));
       // maybe just throw
       if (throwOnBadCall) {
           throw new SQLException("calls to createStatement aren't allowed"));
       }
       return realConnection.createStatement();
    }

本番環境で重くなりすぎたくない場合は、常にそれらをカウントし、volatile boolean logBadCall問題を探してサンプリングするための一定期間のチェックのみを有効にするフラグのタイプを使用できます。おそらく、最初にサンプリングを行い、80% の場所を攻撃し、アプリケーションのクエリ負荷の高い部分を処理したときにのみ、検出を永続的にオンにします。

接続をラップする中央の場所がない場合は、接続プールまたはファクトリをチェーンの少し上にラップする必要がある場合があります。

お役に立てれば。

于 2012-01-16T23:02:16.187 に答える