2013-08-21 100 views
3

阻止SQL注入創建語句有意義嗎?我怎麼能這樣做? 我想使用命令參數,但它不縫到工作:C#阻止SQL注入創建語句

實施例:

var createSql = "CREATE TABLE @TableName (@Column1 ...)"; 
var command = new SqlCommand(); 

command.CommandText = createSql; 
command.Parameters.AddWithValue("@TableName", "XYZ"); 
command.Parameters.AddWithValue("@Column1", "Col"); 

// somewhere else 
command.Connection = connection; 
command.ExecuteNonReader(); // --> exception: invalid syntax at @TableName 

編輯:取決於其他數據生成列和表名。間接也在用戶輸入,是的。給定的創建語句不完整。這只是一個例子。

我的問題是,它似乎命令參數不會被替換。

+0

列名和表名來自哪裏?用戶輸入? – Thilo

+0

請參閱上面的修改。 – SACO

回答

2

不能使用綁定變量表或列名。

所以你必須建立基於字符串連接的是SQL語句,並在必要時,手動報價/轉義,並且必須非常小心你如何去了解它。

用戶直接輸入將是非常危險的,但如果只是間接的,例如只是選擇了自動生成的名稱選項,你應該沒問題。

0

在這個特定的代碼不能有SQL注入,因爲用戶沒有這個發言權。

SQL注入的時候要麼不正確過濾用戶輸入嵌入到SQL語句或用戶輸入的字符串文字的轉義字符不是強類型,並在你的情況下意外地執行

用戶不輸入任何東西所以造成不用擔心。

但是,您創建表查詢是無效的。你可以在創建語句上閱讀here

你不能在創建語句的「...」使用,每列必須有類型

+0

我更新了我的問題以澄清一些事情。 – SACO

+0

@SACO判斷由編輯,你需要更換標題,因爲這不是一個SQL注入的問題,這是一個SqlCommand參數的問題,你也應該給我們的全力拋出的異常,CUS'真正的代碼現在所有的i可以做我指導你的信息和SqlCommand參數的例子 –

+0

由thilo的答案已經指出我需要知道的。 – SACO