2012-01-16 2 views
5

私たちのチームはOWASPのガイドラインをよりよく遵守したいと考えており、その1つはSQLインジェクション攻撃の防止です。これを容易にするために、コードベースでjava.sql.Statementの使用状況を自動的にチェックする方法を探していたので、フラグを付けてPreparedStatementに変更しました。プロジェクト内のjava.sql.Statementの使用を防止する方法を探しています

ビルドプロセスはMavenに基づいており、プロジェクトでアナリティクスを実行するためのSonarセットアップもあります。ある閾値が満たされていれば、私たちのビルドを失敗させるためのいくつかのルールがすでにSonarに設定されているため、そこに実装することができます。私は、インポートを探すcheckstyle正規表現のルールをどこで設定できるかを見てきましたが、他のオプションもあるかどうかを見たいと思っていました。

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

ありがとう!!

+0

準備注入命令でも同様の攻撃が可能であることに注意してください。 'connection.prepareStatement(" t1。* from t1、t1.code = '"+ code +"' ");'。最も良いことは、開発者を教育することです。 –

+0

私たちはOWASP監査を行い、より具体的な項目を探します。私はこれに関するあなたの声明に同意しますが、我々は同様に検査の自動化された層のいくつかのタイプが欲しいです。 – jaycyn94

答えて

7

私はcreating an architectural constraintをソナー内に提案します。

この例では、* java.sql。**クラスの使用を禁止するルールを示しています。

+0

これはまさに私が探していたものです。どういうわけか私はソナーのそのルールを見落としました。ありがとう!チャンピオンのように動作します。 – jaycyn94

1

私はそれを使用していませんが、PMDはこれのための良いツールかもしれないようです。

+0

SONARは、PMD、CheckStyle、FindBugsなどのメトリックからのレポートを集約します。 SONARが使用されている場合、PMDがすでに使用されている可能性があります。 –

+0

これを直接チェックするPMDルールは見ていないので、チェックするカスタムルールを作成して[CheckStyle](http://checkstyle.sourceforge.net/)と同じグループに分類されます。ありがとう! – jaycyn94

+0

そして@JBNizetポイントには、すでにコード上でPMDルールセットが実行されています。 – jaycyn94

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%の場所を攻撃し、アプリケーションの高負荷部分を処理したときにのみ検出を永久に行うことがあります。

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

これが役に立ちます。

関連する問題