馬丁·福勒在他的書的企業應用架構的模式說避免字符串連接創建查詢
一個好的經驗法則是,以避免字符串連接放在一起 SQL查詢
這是我經常用來從查詢的真實data
中抽象出我的SQL查詢的語法的一種做法。
你能解釋一下爲什麼這被認爲是不好的做法嗎?
馬丁·福勒在他的書的企業應用架構的模式說避免字符串連接創建查詢
一個好的經驗法則是,以避免字符串連接放在一起 SQL查詢
這是我經常用來從查詢的真實data
中抽象出我的SQL查詢的語法的一種做法。
你能解釋一下爲什麼這被認爲是不好的做法嗎?
雖然因此可能會出現在編譯之前建立的字符串拼接一份聲明usecases,它始終是不好的做法,使用字符串串聯插入查詢參數的原因有兩個:
安全性:對用戶提供的數據使用字符串連接總是容易發生SQL注入攻擊。假設你有一個說法:
query = "select secret_data from users where userid = '" + userid_param + "'";
而且想象有人發送包含"' OR 1=1;"
一個userid_param
...
這種方式捍衛的唯一方法是做100%正確的輸入,衛生,這可能是相當根據使用的語言,很難得到正確的答案。當使用準備好的語句並使用正確實現的驅動程序時,驅動程序將隔離語句形式的查詢參數,因此不會有任何混淆。
_Safety_是另一個原因,例如爲了避免在將'datetime'作爲字符串傳遞時可能發生的本地化問題(01/06/2012 .... 2012-06-01)。如果將它作爲類型爲「datetime」的sql參數傳遞,則不需要關心格式設置或客戶端/數據庫文化設置。你可以免費獲得類型驗證。 – 2015-02-12 09:41:42
主要是因爲** SQL注入** - 一個偉大的許多Web應用程序在那裏最流行的弱點!研究它,閱讀它 - 停止連接你的SQL查詢!使用**參數化查詢**代替 – 2015-02-12 09:18:59
@marc_s,但我可以沒有任何問題轉義連接的數據,以避免sql注入 – marcosh 2015-02-12 09:21:28
@marcosh:http://stackoverflow.com/questions/910465/avoiding-sql-injection-without-parameters – 2015-02-12 09:22:17