command.CommandText = String.Format("CREATE LOGIN {0} WITH password='{1}'", loginName, password);
登錄名和密碼是基於一些用戶輸入如何在C#中的此SQL語句中構建參數化查詢或用戶轉義?
我意識到,這是不好的做法去做詮釋這種方式,但如何避免SQL注入嗎?
command.CommandText = String.Format("CREATE LOGIN {0} WITH password='{1}'", loginName, password);
登錄名和密碼是基於一些用戶輸入如何在C#中的此SQL語句中構建參數化查詢或用戶轉義?
我意識到,這是不好的做法去做詮釋這種方式,但如何避免SQL注入嗎?
呼叫sp_addlogin
代替 - 它已經參數
下面是如何參數的SQL。您可能還想查看處理這類事情的this article on writing a DAO。我不確定您是否可以參數化LoginName。你可能最好是像以前的海報所說的那樣調用sp_addlogin。
command.CommandText= @"CREATE LOGIN @LoginName WITH [email protected]";
command.CommandType = CommandType.Text;
command.Parameters.Add(new SqlParameter()
{
ParameterName = "@LoginName",
Value = "MyLoginNameValue",
SqlDbType = SqlDbType.NVarChar,
Size = 50
});
command.Parameters.Add(new SqlParameter()
{
ParameterName = "@Password",
Value = "MyPasswordValue",
SqlDbType = SqlDbType.NVarChar,
Size = 50
});
不,這不起作用 - 它會拋出一個異常「@LoginName附近語法不正確」。 – Olga
可以嘗試這樣的事:
SqlCommand cmd = new SqlCommand(
"CREATE LOGIN @login WITH [email protected]", conn);
SqlParameter param = new SqlParameter();
param.ParameterName = "@login ";
param.Value = usertextforlogin;
cmd.Parameters.Add(param);
param = new SqlParameter();
param.ParameterName = "@pwd";
param.Value = usertextforpwd;
cmd.Parameters.Add(param);
好像要做到這一點是使用SQL Server SMO SDK最正確的方式。我不關心任何其他SQL引擎,因爲我們絕對不會從SQL Server遷移。
您可以通過在exec
包裝你的DDL查詢參數,例如查詢如下:
command.CommandText = "exec ('CREATE DATABASE ' + @DB)"
如果再(至少在T-SQL)添加參數@DB
照常這應該工作。
應該有可能以相同的方式使用CREATE LOGIN
。
最終字符串連接仍在執行中,只是在數據庫引擎內部,所以我沒有看到這會如何緩解注入(例如'@DB ='\'1 = 1'') – Dai
這裏沒有聲明這是T-SQL方言實際上... – Tigran
好點。有沒有其他'SQL'產品使用相同的語法來創建登錄? – kenwarner
好的,我可以這樣做。現在我正面臨另一個問題 - 我需要創建數據庫。 CREATE DATABASE似乎也不可能被參數化。 – Olga