2009-05-30 29 views
4

我在C#方法中編寫了一個select查詢,它允許客戶端代碼提供一個行ID並取回從該行數據構建的對象。如果行ID是一個整數,並且我已經確認它是正數,那麼通過使用string.Format傳遞它是否有任何傷害?如果只允許傳入int而不是字符串,我不會看到有什麼損壞可以完成。何時可以安全地在SQL命令中使用非參數化變量?

回答

12

你說得對,以這種方式傳遞一個整數是安全的。不過,這個故事還有另一面。

雖然可以認爲只是格式化int並創建SQL表達式,但還有一個性能考慮因素。當SQL服務器第一次看到查詢時,它將創建並緩存該查詢的執行計劃。下一次發出相同的查詢時,執行計劃將被重用。

如果您傳遞不同的字符串,它將被視爲單獨的查詢,需要單獨的執行計劃。如果每次傳遞相同的參數化查詢(使用不同的參數),則第一個執行計劃將由SQL Server重新使用。

即使您不關心性能優勢,我仍然會對所有針對數據庫的查詢使用參數化查詢,即使對於那些可以視爲「安全」的指針,也只是爲了保持一致應用程序訪問數據的方式。如果您使用總是使用參數化查詢,它也爲您節省了每次確定查詢是否安全以便確定以何種方式查詢數據庫的麻煩。

1

你在這裏回答你自己的問題。 System.Int32不能包含

';DROP DATABASE xxx;-- 

如果這就是你所擔心的。即使傳遞負數也不會對數據庫造成負面影響!

+0

好的。我在這方面比較新,而且完全在數據庫上自學(不要擔心世界,我已經學習了所有6種正常形式),所以我擔心有一些已知的技巧傳遞某個整數可能會造成嚴重破壞。 – ehdv 2009-05-30 15:04:01

+0

我會謹慎的通過666.這樣的東西更好保密! ;-) – Andomar 2009-05-30 15:16:26

相關問題