Sql Server防止Sql Injection Attack的最简单的办法

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

转载于:https://www.cnblogs.com/Yahong111/archive/2007/06/07/775042.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值