Sql Server防止Sql Injection Attack的最简单的办法
2007-06-07 12:26
1676 查看
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的介绍:
/article/5152084.html
可以简单的办法呢?当然有。
那就是——用存储过程……^_^
放屁!你这不是等于白说么?
别急,通过对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的介绍:
/article/5152084.html
相关文章推荐
- 技术专题:ROS通过TTL值来防止二层路由的最简单办法
- SQL SERVER无法安装成功,sqlstp.log文件提示[未发现数据源]的解决办法
- SQL Server 索引使用分析(2)- 改善SQL语句,防止索引失效
- Google Dork 2014 List For SQL Injection Attack : Fresh Google Dorks 2014 List
- 两段简单的JS代码防止SQL注入
- SQL Injection Attack
- SQL Server 装载 msxmlsql.dll 失败的解决办法
- 防止SQL SERVER的事件探查器跟踪软件的SQL脚本
- 防止SQL SERVER的事件探查器跟踪软件的SQL脚本
- SQL Server Mangement Studio无法创建Database Dagrams的简单解决办法
- 一个极其简单的防止SQL注入的办法(只针对部分有效)转自csdn论坛
- 【SQL 问题】sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
- [SQL-码农]SQL Server 2000超过了每行的最大字节数(8060)的原因和解决办法
- sql防止注入的简单实现
- 防止SQL SERVER的事件探查器跟踪软件的SQL脚本
- sql server竟然可以有办法不让事件探测器显示具体的sql
- c#配置问题以及简单防止sql注入,连接池问题,sqldatareader对象对于connection对象的释放
- SQL Server 2005安装完后没有SQL Server Management Studio的解决办法
- SQL SERVER 导入.sql文件 出现SYSTEM.OUTOFMEMORY EXCEPTION 异常解决办法