如何在C#中的SQL语句中构建参数化查询或用户转义?

command.CommandText = String.Format("CREATE LOGIN {0} WITH password='{1}'", loginName, password); 

loginName和password基于某些用户输入

我意识到这样做是不好的做法但是如何在这里避免sql注入?

改为调用sp_addlogin – 它已经参数化了

以下是如何参数化SQL。 您可能还想查看有关编写处理此类事物的DAO的这篇文章 。 我不确定你是否可以参数化LoginName。 你可能最喜欢调用sp_addlogin,就像上一张海报所说的那样。

  command.CommandText= @"CREATE LOGIN @LoginName WITH password=@Password"; 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 }); 

看起来最合适的方法是使用SQL Server SMO SDK。 我不关心任何其他SQL引擎,因为我们永远不会从SQL Server迁移。

您可以通过将DDL查询包装在exec来参数化此类查询,如下所示:

command.CommandText = "exec ('CREATE DATABASE ' + @DB)"

如果你像往常一样为@DB添加参数,这应该可行(至少在t-sql中)。

应该可以以相同的方式使用CREATE LOGIN

可以尝试这样的事情:

 SqlCommand cmd = new SqlCommand( "CREATE LOGIN @login WITH password=@pwd", 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);