如何在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);