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

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

loginName和password是基于用户输入的。

我意识到这种做法是不好的,但如何避免SQL注入攻击呢?

5个回答

8
请使用 sp_addlogin 代替原有的方法 - 这个方法已经参数化了。

好的观点。还有其他使用相同语法创建登录的 SQL 产品吗? - kenwarner
好的,我可以这样做。现在我面临另一个问题 - 我需要创建数据库。CREATE DATABASE 似乎也无法进行参数化。 - Olga
2
值得注意的是,sp_addlogin 的 MSDN 页面警告称该存储过程将不会在未来的 SQL Server 版本中提供,并且因此不应在新开发中使用。请参见此处:http://msdn.microsoft.com/zh-cn/library/ms173768.aspx。 - Jon Egerton

0

以下是如何将您的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
            });

1
不行,这会抛出一个异常:“在 '@LoginName' 附近有语法错误。” - Olga

0

看起来最正确的方法是使用SQL Server SMO SDK。我不关心其他任何SQL引擎,因为我们肯定不会从SQL Server移动。


0

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

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

然后按照惯例添加@DB参数即可使其正常工作(至少在t-sql中是这样的)。

同样的方式也适用于CREATE LOGIN


最终仍然执行了字符串连接,只不过是在数据库引擎内部执行的,因此我不认为这能够缓解注入攻击(例如 @DB = '\'1=1')。 - Dai

-1
可以尝试这样做:
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);

在 T-SQL 中,您不能将对象名称参数化,而 CREATE LOGIN 语句使用对象名称而不是字符串/文本值作为其参数。 - Dai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接