2015-02-12 63 views
3

馬丁·福勒在他的書的企業應用架構的模式避免字符串連接創建查詢

一個好的經驗法則是,以避免字符串連接放在一起 SQL查詢

這是我經常用來從查詢的真實data中抽象出我的SQL查詢的語法的一種做法。

你能解釋一下爲什麼這被認爲是不好的做法嗎?

+8

主要是因爲** SQL注入** - 一個偉大的許多Web應用程序在那裏最流行的弱點!研究它,閱讀它 - 停止連接你的SQL查詢!使用**參數化查詢**代替 – 2015-02-12 09:18:59

+0

@marc_s,但我可以沒有任何問題轉義連接的數據,以避免sql注入 – marcosh 2015-02-12 09:21:28

+1

@marcosh:http://stackoverflow.com/questions/910465/avoiding-sql-injection-without-parameters – 2015-02-12 09:22:17

回答

6

雖然因此可能會出現在編譯之前建立的字符串拼接一份聲明usecases,它始終是不好的做法,使用字符串串聯插入查詢參數的原因有兩個:

  1. 性能:當使用準備好的語句,查詢語法只能被解析一次,而訪問路徑只能針對每個不同的查詢類型計算一次。當通過字符串連接解析和優化構建語句時,必須爲每個查詢執行完成。
  2. 安全性:對用戶提供的數據使用字符串連接總是容易發生SQL注入攻擊。假設你有一個說法:

    query = "select secret_data from users where userid = '" + userid_param + "'"; 
    

而且想象有人發送包含"' OR 1=1;"一個userid_param ...

這種方式捍衛的唯一方法是做100%正確的輸入,衛生,這可能是相當根據使用的語言,很難得到正確的答案。當使用準備好的語句並使用正確實現的驅動程序時,驅動程序將隔離語句形式的查詢參數,因此不會有任何混淆。

+1

_Safety_是另一個原因,例如爲了避免在將'datetime'作爲字符串傳遞時可能發生的本地化問題(01/06/2012 .... 2012-06-01)。如果將它作爲類型爲「datetime」的sql參數傳遞,則不需要關心格式設置或客戶端/數據庫文化設置。你可以免費獲得類型驗證。 – 2015-02-12 09:41:42