2012-07-12 112 views
4

我知道準備語句的強大功能,但我無法在此處使用它。我通過HTTP將sql查詢發送到外部服務器,而不是通過JDBC。 如何爲SQL查詢轉義字符串?有辦法通過JDBC來做到這一點?或者我應該使用自定義類/功能呢?如何爲SQL查詢轉義字符串(沒有準備好的語句)

p.s.另外我也連接到其他數據庫,所以我可以使用JDBC功能。

回答

1

這聽起來很沒有安全感。如果你通過HTTP發送SQL語句,那麼你可能會受到中間人攻擊(等等)的攻擊。除此之外,任何普通的程序員都可能試圖對數據庫執行惡意SQL,只要他們看到你正在發送SQL語句。他們可以創建用戶,更改密碼,檢索敏感數據......您確定這是處理事情的最佳方式嗎?

1

我知道鏈接真的不會做出很好的答案 - 但如果您無法使用Prepared Statements,則此SQL Injection Prevention Cheat Sheet是一個很好的閱讀(並且方式太大了,無法在此處發佈) - 它爲您提供了很多關於如何防止SQL注射

+0

試試這個 org.apache.commons.lang.StringEscapeUtils.escapeSql – siddhusingh 2015-01-10 04:01:17

1

Read this其中有這樣的:

static public String escapeLine(String s) { 
    String retvalue = s; 
    if (s.indexOf ("'") != -1) { 
    StringBuffer hold = new StringBuffer(); 
    char c; 
    for(int i=0; i < s.length(); i++) { 
     if ((c=s.charAt(i)) == '\'') { 
     hold.append ("''"); 
    }else { 
     hold.append(c); 
    } 
    } 
    retvalue = hold.toString(); 
    } 
    return retvalue; 
} 
+1

如果第四用戶提供一個字符串,會發生什麼轉義字符''\''在裏面?比如'bobby \'AND \'1 \'= \'1'? – MatBailie 2012-07-12 09:27:10

+0

鏈接被破壞,感謝記住轉儲相關的代碼在這裏! – 2014-02-21 13:36:49

1

儘管其他人已經告訴,這不是一個好主意。您可以通過HTTP調用「模仿」PreparedStatement的行爲。

通話中只需發送多個參數,如

/sqlInterperter.do?sql=somesql_with_params&param1=...&param2=... 

然後ATLEAST可以在接收方再次使用準備好的語句。

(不過任何人都可以發送給您的任何陳述所以最好的是:不要做)