簡體   English   中英

使用Order By的准備好的語句來防止SQL注入Java

[英]Using prepared statement for Order by to prevent SQL injection java

我有一個查詢,其中條件,按順序和限制。 我正在使用准備好的語句來設置where條件和限制。 目前,我在使用字符串追加命令,從而導致SQL注入漏洞。

我不能使用set string來按以下order by ? ? order by ? ? 如果我這樣做,SQL Order功能將無法正常工作。

查詢示例:

SELECT siteid, technology, address, state, status FROM archive  LEFT OUTER 
JOIN mappings ON siteid = child_site_id order by siteid asc limit ? offset ?


SELECT siteid, technology, address, state, status FROM archive  LEFT OUTER 
JOIN mappings ON siteid = child_site_id order by siteid asc limit 10 offset 0

我可以通過其他任何方式來避免SQL注入。

做這樣的事情並將其連接起來:

List<String> allowedSortableColumns = Arrays.asList(new String[]{"siteid", "technology", "address"})
if(! allowedSortableColumns.contains(sortByColumn)){
   throw new RuntimeException("Cannot sort by: " + sortByColumn);
}
// Continue here and it's safe to concatenate sortByColumn...

您可以進行消毒和其他操作,但這應在您的情況下起作用

您應該使用可能的列的白名單:

String[] cols = {"siteid", "technology", "address", "state", "status"};

然后在與用戶引用列時使用索引:

int colFromUser = Integer.parseInt(request.getParameter("sortCol"));

並在將列名附加到order by列表的order by之前驗證索引:

if(colFromUser < 0 || colFromUser >= cols.length) {
    throw new IllegalArgumentException("Invalid column");
}
String col = cols[colFromUser];
query.append(col);

雖然是我,但我會使用類似Hibernate的標准來完成這項工作:

 Criteria c2 = session.createCriteria(Supplier.class); c2.addOrder(Order.desc("name")); 

PreparedStatement SetMethods僅適用於數據庫表的列值( SELECTDELETE SQL語句的WHERE子句值,還包括UPDATEINSERT語句的要更新或插入的列值)。

因此,這意味着無法通過java.sql.PreparedStatement問號( ? )來參數化通常的SQL部分(如列名,表模式,表名,ORDER BY,GROUP BY,分頁(LIMIT,OFFSET,FETCH FIRST等)) java.sql.PreparedStatement

將用戶輸入中的值直接附加到查詢將導致安全漏洞,唯一的出路是從SQL的這些部分的有效值列表中檢查輸入值。

例如,您期望使用什么表名? ,特定表應采用哪種模式? ,特定表中存在哪些列? ,頁碼是整數嗎?LIMIT值是整數嗎? ORDER BY子句的列名之后的值只能是ASCDESC ,而不能是其他等等。

您可以動態填充這些有效值,也可以在系統中添加硬代碼。

如果傳遞了無效值,則我們不執行查詢(並將其記錄為error)或將無效值替換為有用的默認值並執行查詢。

暫無
暫無

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

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