【问题标题】:Looking for a way to prevent to usage of java.sql.Statement in project寻找一种方法来防止在项目中使用 java.sql.Statement
【发布时间】:2012-02-11 13:25:08
【问题描述】:

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

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

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

谢谢!!

【问题讨论】:

  • 请注意,同样的注入攻击也可以使用准备好的语句进行:connection.prepareStatement("select t1.* from t1 where t1.code = '" + code + "'");。最好的办法是教育开发人员。
  • 我们将通过 OWASP 审核,他们将寻找更具体的项目。我同意您对此的说法,但我们也需要某种类型的自动检查层。

标签: java sonarqube owasp


【解决方案1】:

我建议在 Sonar 中使用 creating an architectural constraint

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

【讨论】:

  • 这正是我想要的。不知何故,我在声纳中忽略了这条规则。谢谢!像冠军一样工作。
【解决方案2】:

您能否使用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% 的位置,然后只有在您处理完应用程序的高查询负载部分后才能永久启用检测。

如果您没有一个中心位置来包装连接,那么您可能需要将连接池或工厂稍微包装一下。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我没用过,但PMD 看起来可能是一个很好的工具。

    【讨论】:

    • SONAR 汇总来自 PMD、CheckStyle、FindBugs 和其他指标的报告。很有可能 PMD 已经被使用,而 SONAR 被使用。
    • 我没有看到任何可以直接检查的 PMD 规则,因此它与 CheckStyle 属于同一组,并创建了一个自定义规则进行检查。谢谢!
    • @JBNizet 点,我们已经在代码上运行 PMD 规则集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2015-09-25
    • 2021-12-21
    • 2011-08-17
    • 1970-01-01
    相关资源
    最近更新 更多