簡體   English   中英

Java Veracode 掃描 - SQL 注入的誤報

[英]Java Veracode Scan - False Positive on SQL Injection

我們在 Java 代碼中得到一個“CWE-89:SQL 命令中使用的特殊元素的不當中和('SQL 注入')”:

    private static void doSomethingWithDB(int queryFetchSize, String sql, Object... params)
        try {
            Connection connection = ...

            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setFetchSize(queryFetchSize);
            for (int i = 0; i < params.length; i++) {
                statement.setObject(i + 1, params[i]);
            }
            ResultSet resultSet = statement.executeQuery(); //this is where Veracode reports error
        ....

從外部傳遞 SQL 不是最佳設計實踐,但在這種特殊情況下是可以的(方法是私有的,SQL 查詢在我們的控制之下)。

在這種情況下,如何讓 Veracode 不那么偏執?

在這種情況下,一種解決方法是將 sql 的標識符(例如枚舉)傳遞給方法而不是 sql 本身,然后將此標識符映射到方法主體內的實際 sql。 所以示例代碼應該是這樣的:

 private static void doSomethingWithDB(int queryFetchSize, SqlName sqlName, Object... params)
    try {
        Connection connection = ...

        PreparedStatement statement = connection.prepareStatement(SqlMap.get(sqlName));
        statement.setFetchSize(queryFetchSize);
        for (int i = 0; i < params.length; i++) {
            statement.setObject(i + 1, params[i]);
        }
        ResultSet resultSet = statement.executeQuery();
    ....

SqlName是代表您預定義的 sql 的枚舉, SqlMap是在其他地方定義的枚舉鍵映射,包含實際的 sql。 有了這個解決方案,Veracode 不再抱怨 sql 注入,這對我來說很有意義,因為現在你不能在你的方法中使用任何sql,只有你認識的一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM