2013-10-22 41 views
1

假設我想刪除一個名稱爲變量值的表,比如「#t」。如何安全地刪除具有變量名稱的表格?

SqlCommand cmd = new SqlCommand("drop table " + TableName); //Not safe 
SqlCommand cmd = new SqlCommand("drop table [" + TableName +"]"); //Not safe 
EXEC('drop table [' + @tablename +"]"); --Not safe 

以上都不是安全的SQL注入,那麼有什麼選擇?

人們說「你必須使用動態SQL」,但是這些例子通常還是像上面第三個例子那樣涉及到不安全的連接。

與我能找到的答案最接近的地方(https://stackoverflow.com/a/14026855/88409)基本上說你必須自己檢查一下,並且沒有辦法繞過它(例如,通過解析或從可信來源獲取變量來確保變量是有效的) ,但我對這個答案並不滿意。

+0

背景:我構建了一個名爲TempIDTable的C#類,其構造函數接受SqlConnection和一個整數列表。它會生成一個具有給定名稱的臨時表,可選地使用行號列,並執行批量插入的ID。你可以將整個東西包裝在C#中的使用塊中,而dispose方法處理掉表格。在使用塊中,可以使用常規的SqlCommand選擇語句與id列上的臨時表連接來選擇所需的記錄,並且在處理大量的id列表時,其速度比以任何其他方式快得多。 – Triynko

+0

該類爲名稱使用了一個常量「#s」,但我想讓表名變成一個變量,並且爲了確保drop語句不會因爲程序員錯誤或其他原因而行爲不當,我想強制執行規則表名必須是有效/帶引號的表名,另外它必須是以'#'開頭的臨時表。 – Triynko

+0

僅供參考......當連接關閉時,臨時表會自動刪除。請參閱此頁上的「臨時表」段落:http://technet.microsoft.com/en-us/library/ms174979.aspx – David

回答

3

QUOTENAME function將確保您的變量被視爲「有效的SQL Server分隔標識符」。

然後,您可以決定給出的表是否應該允許刪除。也許在桌面上的SQL權限或可以刪除​​的表的白名單...

+0

所以基本上:EXEC('drop table'+ QUOTENAME(@tablename))將是安全的。我想知道.NET中是否有一個等價的函數,我也想知道QUOTENAME是否對數據庫中是否使用帶引號的標識符選項很敏感,並且具體說明當一個替代引號傳遞給它時它是如何工作的作爲「<」,「(」和「{」。 – Triynko

+0

是的,該代碼應該是安全的。我從來沒有見過.Net相當於該功能。 – David

相關問題