![](/img/trans.png)
[英]How to build query in Java to prevent SQL injection using prepared statement
[英]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僅適用於數據庫表的列值( SELECT
& DELETE
SQL語句的WHERE
子句值,還包括UPDATE
& INSERT
語句的要更新或插入的列值)。
因此,這意味着無法通過java.sql.PreparedStatement
問號( ?
)來參數化通常的SQL部分(如列名,表模式,表名,ORDER BY,GROUP BY,分頁(LIMIT,OFFSET,FETCH FIRST等)) java.sql.PreparedStatement
將用戶輸入中的值直接附加到查詢將導致安全漏洞,唯一的出路是從SQL的這些部分的有效值列表中檢查輸入值。
例如,您期望使用什么表名? ,特定表應采用哪種模式? ,特定表中存在哪些列? ,頁碼是整數嗎?LIMIT值是整數嗎? ORDER BY
子句的列名之后的值只能是ASC
或DESC
,而不能是其他等等。
您可以動態填充這些有效值,也可以在系統中添加硬代碼。
如果傳遞了無效值,則我們不執行查詢(並將其記錄為error)或將無效值替換為有用的默認值並執行查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.