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移动。
您可以通过在exec
中包装DDL查询来参数化此类查询,如下所示:
command.CommandText = "exec ('CREATE DATABASE ' + @DB)"
然后按照惯例添加@DB
参数即可使其正常工作(至少在t-sql中是这样的)。
同样的方式也适用于CREATE LOGIN
。
@DB = '\'1=1'
)。 - DaiSqlCommand 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);
CREATE LOGIN
语句使用对象名称而不是字符串/文本值作为其参数。 - Dai
SQL
产品吗? - kenwarnersp_addlogin
的 MSDN 页面警告称该存储过程将不会在未来的 SQL Server 版本中提供,并且因此不应在新开发中使用。请参见此处:http://msdn.microsoft.com/zh-cn/library/ms173768.aspx。 - Jon Egerton