[英]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.