2013-07-14 274 views
1

如果我有與SQL代碼如#PreserveSingleQuotes(arguments.sql)#最佳實踐

  1. 什麼是運行這段代碼的最佳方式變量?

  2. 是否有一種方式來運行這一點,如果SQL注入攻擊是可能的嗎?

這個問題是一個跟進Variable as SQL in cfquery

+1

關於第二個問題,這是驗證用戶輸入的cfquery標籤獲取看到它之前一個很好的做法。 –

+0

同意。在存儲某些東西時,應該確定它實際上是一個人想要存儲的東西。參數化SQL語句應該是後退,而不是前線。參數化的主要重點應該是提高數據庫性能,使用SQL注入防止帶來的好處是副作用。 –

+0

同意關於綁定變量。關於'PreserveSingleQuotes',我認爲一旦你使用它,沒有任何合理的方法來保護查詢。基本上,當CF通過自動轉義單引號保護查詢時,它基本上恢復到MX之前的行爲。所以你在沒有網絡的情況下工作。除非你確定你正在執行的sql *和*參數是安全的,否則應該避免。 – Leigh

回答

2

#1是有點好笑的問題,因爲你沒有選擇,以手大量。從ColdFusion的角度來看,你既可以通過<cfquery>或通過Query.cfc運行它。另外,DB系統可以接收一個包含SQL的字符串並執行它,但這只是從CF向數據庫稍微提取問題。我不確定還有其他選擇。

至於#2變,使用<cfquery>當作爲有減緩SQL注入(當然也沒有優化的SQL的編譯過程的方式)的任何好(或至少合理的)方式,因爲只有這是個大問題參數化語句中值的方法是通過<cfqueryparam>,並且不能將這些值嵌入到充滿SQL的字符串中。這裏的解決方案是使用Query.cfc(我不相信我使用Query.cfc,因爲它是關於CFML語言最執行不力的部分,IMO推薦),因爲一個可以指定SQL字符串中的任何位置或命名參數,並通過參數值分開。

最後,你應該始終明確將值作爲參數,而不是手工編碼的SQL語句他們,如果這意味着不使用SQL語句中的預創建的字符串,那就這樣吧。