Sql注入式攻击让人防不胜防,根据微软的解决办法,就是用存储过程。但是如果每个Sql操作都用存储过程来实现,这也太麻烦了点,有没有
可以简单的办法呢?当然有。
那就是——用存储过程……^_^
放屁!你这不是等于白说么?
别急,通过对SqlCommand的ExecuteNonQuery,ExecuteScalar,BeginExecuteReader 进行跟踪,发现如果Sql语句中含有SqlParameter,则系统
会自动调用sp_executesql来处理,而如果没有SqlParameter,则系统会直接执行该Sql语句。
比如
string Sql="select UserID,UserName,Email from Users where UserID='C054965'";
SqlCommand cmd = new SqlCommand(Sql, Connection);
try
{
cmd.Connection.Open();
SqlDataReader Reader=cmd.ExecuteReader();
//
//.....
//
}
finally
{
cmd.Connection.Close();
}
这时,通过跟踪,发现Sql Server是直接执行select语句
然而下面的语句就不一样了
string Sql="select UserID,UserName,Email from Users where UserID=@UserID";
SqlCommand cmd = new SqlCommand(Sql, Connection);
cmd.Parameters.Add(new SqlParameter("@UserID","C054965"));
try
{
cmd.Connection.Open();
SqlDataReader Reader=cmd.ExecuteReader();
//
//.....
//
}
finally
{
cmd.Connection.Close();
}
Sql Server 系统执行的是
exec sp_executesql N'select UserID,UserName,Email from Users where UserID=@UserID ', N'@UserID nvarchar(7)', @UserID =
N'C054965'
现在我们来进行Sql Injection Attack。
string Sql="select UserID,UserName,Email from Users where UserID=@UserID";
SqlCommand cmd = new SqlCommand(Sql, Connection);
cmd.Parameters.Add(new SqlParameter("@UserID","C054965;create table aa(a int);--"));
//
//....
//
这时系统不会返回正确的数据
因为Sql Server执行的是
exec sp_executesql N'select Email,UserID,UserName from Users where UserID=@UserID and Pwd=@Pwd', N'@UserID nvarchar(33)',
@UserID = N'C054965;create table aa(a int);--'
而且,由于执行的是存储过程,所以也不会执行后面的create table 语句。
这样就可以有效的避免Sql注入式攻击了。
总结:
通过在SqlCommand的CommandText中加入SqlParameter,可以有效的防止Sql注入式攻击,而不用编写专门的存储过程。这可以在很大程度上
提高我们的开发效率,提升业务逻辑层的灵活性。
实际上,我们还是在用存储过程,不过是SqlCommand帮我们自动实现了。
备注:
DongLiORM平台在进行数据读写时,就大量的运用了这个技巧。他自动生成的Sql全部都是基于SqlParameter的。
比如
select UserId,UserName from users where UserID=@UserID
insert into Users(UserID,UserName) values(@UserID,@UserName)
delete from users where UserID=@UserID
update users
set UserName=@UserName
where UserID=@UserID_old
这样就可以有效避免Sql注入式攻击了。
DongLiORM的介绍:
http://www.cnblogs.com/Yahong111/archive/2007/06/06/774236.html