簡體   English   中英

如何保護自己免受動態查詢中的 SQL 注入?

[英]How to protect yourself against SQL Injection in dynamic queries?

我的應用程序獲取到數據庫的字符串 object 查詢。 例如String query = EMAIL like '% test%' and USER_NAME like '% user%' 查詢是動態構建的,我不知道它的結構,所以我不能利用PrepareStatement 有誰知道在這種情況下防止 SQL 注入的方法?

數據庫:Oracle
語言:Java 1.6

請幫忙。

即使您不知道結構,也可以使用PreparedStatement 讓我用一個簡單的例子來演示:

List<Object> arguments = new ArrayList<Object>();
String sql = "SELECT * FROM user WHERE someCondition = ?";
if (queryOnEmail) {
  sql = sql + " AND email LIKE ?";
  arguments.add(email);
}
if (queryOnUserName) {
  sql = sql + " AND user_name LIKE ?";
  arguments.add(userName);
}
PreparedStatement stmt = con.prepareStatement(sql);
int i = 1;
for(Object o : arguments) {
  stmt.setObject(i, o);
  i++;
}

當然,您可以將這個 SQL + arguments 結構包裝到它自己的 class 中以簡化其使用。

正如這篇文章中所解釋的,您的應用程序可能會發生比經典表DROP更多的壞事:

  • 調用 sleep function 以便您的所有數據庫連接都將處於忙碌狀態,從而使您的應用程序不可用
  • 從數據庫中提取敏感數據
  • 繞過用戶認證

最重要的是,在構建 SQL 語句時,您永遠不應該使用字符串連接。 為此目的使用專用的 API:

您可以在構建查詢和使用 PreparedStatement 時為語句動態構建變量列表。

另外:永遠不要相信用戶的輸入總是好的做法。 在處理任何輸入數據之前,首先刪除所有轉義字符和特殊字符: String.replace("\\" | "\"", "");

暫無
暫無

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

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