5

我们的团队希望更好地遵守 OWASP 指南,其中一项任务是防止 SQL 注入攻击。为了促进这一点,我一直在寻找一种方法来自动检查java.sql.Statement我们代码库中的使用情况,因此可以将其标记并更改为使用PreparedStatement.

我们的构建过程基于 Maven,我们还设置了声纳来对项目运行分析。如果满足某些阈值,Sonar 中已经有一些规则可以使我们的构建失败,因此可以在那里实施。我已经看到可以在哪里设置检查样式正则表达式规则以查找导入,但我想看看是否还有其他选项。

开发/构建路径上的任何位置都可以工作。如果 intellij 中有一些东西可以标记这个,maven 构建过程中有一些东西,或者在 Sonar 中标记这个的不同方式,这些都可以。

谢谢!!

4

3 回答 3

7

我建议在 Sonar 中创建一个架构约束。

该示例演示了禁止使用 *java.sql.** 类的规则。

于 2012-01-17T00:23:41.873 回答
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 回答