我在C#方法中編寫了一個select查詢,它允許客戶端代碼提供一個行ID並取回從該行數據構建的對象。如果行ID是一個整數,並且我已經確認它是正數,那麼通過使用string.Format傳遞它是否有任何傷害?如果只允許傳入int而不是字符串,我不會看到有什麼損壞可以完成。何時可以安全地在SQL命令中使用非參數化變量?
4
A
回答
12
你說得對,以這種方式傳遞一個整數是安全的。不過,這個故事還有另一面。
雖然可以認爲只是格式化int並創建SQL表達式,但還有一個性能考慮因素。當SQL服務器第一次看到查詢時,它將創建並緩存該查詢的執行計劃。下一次發出相同的查詢時,執行計劃將被重用。
如果您傳遞不同的字符串,它將被視爲單獨的查詢,需要單獨的執行計劃。如果每次傳遞相同的參數化查詢(使用不同的參數),則第一個執行計劃將由SQL Server重新使用。
即使您不關心性能優勢,我仍然會對所有針對數據庫的查詢使用參數化查詢,即使對於那些可以視爲「安全」的指針,也只是爲了保持一致應用程序訪問數據的方式。如果您使用總是使用參數化查詢,它也爲您節省了每次確定查詢是否安全以便確定以何種方式查詢數據庫的麻煩。
1
你在這裏回答你自己的問題。 System.Int32不能包含
';DROP DATABASE xxx;--
如果這就是你所擔心的。即使傳遞負數也不會對數據庫造成負面影響!
相關問題
- 1. 是否可以在函數中使用非全局變量?
- 2. 安全地傳遞使變量shell命令
- 3. 參數化Sql命令
- 4. 是否可以在postgres sql命令中引用環境變量?
- 5. 在C#中命令行安全地轉義參數
- 6. 如何設計/執行命令模式時,命令可變數量的參數?
- 7. 何時使用環境變量或命令行參數?
- 8. 命令類型爲adCmdText時可以使用命名參數嗎?
- 9. Salt:我可以使用命令行中的參數作爲jinja變量嗎?
- 10. 使用現有全局變量在Node.js中執行命令行參數?
- 11. 是否可以在遠程ssh命令中使用變量?
- 12. 何時可以將引用變量安全且容易地用作別名?
- 13. 如何在PHP中安全地正確使用SQL查詢中的變量?
- 14. 如何隱藏$ _GET變量以更安全地使用PHP?
- 15. 何時可以安全地提交FragmentTransaction?
- 16. 如何安全地使用變化的哈希,如時間?
- 17. 使用變量在命令
- 18. 在Travis * .yml文件中使用Maven測試命令中的「安全」變量
- 19. 如何安全地在對象中使用變量?
- 20. 如何在linux中安全地使用http_proxy變量
- 21. 期望的'spawn'命令是否安全地傳遞參數?
- 22. 在經典ASP中使用變量參數化SQL
- 23. 參數化的SQL查詢和安全
- 24. 「動態」類型可以在通用集合中安全地變化<dynamic>?
- 25. 如何使用變量命令行參數運行程序?
- 26. 如何使用PowerShell變量作爲命令參數?
- 27. 如何使用unix find命令的path參數變量?
- 28. 使用命令行參數安裝IIS8
- 29. Malloc可以安全地使用nogil嗎?
- 30. 我可以安全地使用域URI
好的。我在這方面比較新,而且完全在數據庫上自學(不要擔心世界,我已經學習了所有6種正常形式),所以我擔心有一些已知的技巧傳遞某個整數可能會造成嚴重破壞。 – ehdv 2009-05-30 15:04:01
我會謹慎的通過666.這樣的東西更好保密! ;-) – Andomar 2009-05-30 15:16:26