我已经用C#编写了一个CLR存储过程
[Microsoft.SqlServer.Server.SqlProcedure]
public static void IsUserNameExists(string strUserName, out SqlBoolean returnValue)
{
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
SqlCommand command = new SqlCommand("Select count(UserName) from [User] where UserName='" + strUserName + "'", connection);
int nHowMany = int.Parse(command.ExecuteScalar().ToString());
if (nHowMany > 0)
returnValue = true;
else
returnValue = false;
}
}
是否容易受到SQL注入攻击?我正在使用SqlParameter
。任何最佳做法?
答案 0 :(得分:3)
防止sql注入的唯一正确方法应该是使用参数化查询。 你正在做的事情并不安全,因为你正在连接字符串。
请在此处查看此参考资料How do parameterized queries help against SQL injection?
为了清楚起见,为什么您的代码容易受到攻击:
就SQLParameter
而言,即使'); DROP TABLE YourTable;--
之类的内容也是有效的输入(因为它是一个字符串)。然后,您将使用它来创建内部查询,这是您的SQL注入。
答案 1 :(得分:1)
是否容易受到SQL注入攻击?
是:
SomeType.IsUserNameExists("'; insert into [User](UserName) values ('Malefactor_Username'); select '1", out returnValue);
任何最佳做法?
始终使用参数化查询。
答案 2 :(得分:0)
CLR存储过程默认情况下不会阻止此操作。你需要自己这样做,因为CLR不会自动执行此操作(我想这是你想知道的实际问题)
只需像这样更新你的代码,你应该都很好。
[Microsoft.SqlServer.Server.SqlProcedure]
public static void IsUserNameExists(string strUserName, out SqlBoolean returnValue)
{
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
SqlCommand command = new SqlCommand("Select count(UserName) from [User] where UserName=@UserName", connection);
command.Parameters.Add(new SqlParameter("@UserName", strUserName));
int nHowMany = int.Parse(command.ExecuteScalar().ToString());
if (nHowMany > 0)
returnValue = true;
else
returnValue = false;
}
}