--------------------- Windows Phone 7手机开发 .Net培训 期待与您交流! ----------------------
1、SQL注入漏洞攻击
//输入相关数据
漏洞分析:
解决方案:
--------------------- Windows Phone 7手机开发 .Net培训 期待与您交流! ----------------------
1、SQL注入漏洞攻击
- 登录判断:select * from T_Users where UserName=... and Password=...,将参数拼到SQL语句中.
- 构造恶意的Password: ‘ or ’1'='1
{Console.WriteLine("登录成功");}else{Console.WriteLine("登录失败");}
- 防范注入漏洞攻击的方法:不使用SQL语句拼接,通过参数赋值
- SQL语句使用@UserName表示“此处用参数代替”,向SqlCommand的Parameters中添加参数
cmd.Parameters.Add(SqlParameter("UserName","admin"));
cmd.Parameters.Add(SqlParameter("Password","123456"));
- 参数在SQLServer内部不是简单的字符串替换,SQLServer直接用添加的值进行数据比较,因此不会有注入漏洞攻击
例子1:
//输入相关数据
Console.WriteLine("请输入用户名:");
string username=Console.ReadLine();
Console.WriteLine("请输入密码:");
string password=Console.ReadLine();
//开始连接数据库
using(SqlConnection conn = new SqlConnection(/*数据库地址及相关设置参数*/))
{
//打开数据库
conn.Open();
//新建SqlCommand指令
using(SqlCommand cmd = conn.CreateCommand())
{
//指定select语句
cmd.CommandText="select * from T_Users where UserName=' " +username+"'
and Password=' "+password+" ';
//得到返回的执行结果
int i=Conver.ToInt32(cmd.ExecuteScalar());
//如果返回结果,即影响行数大于0,说明执行sql语句成功
if(i>0)
{
Console.WriteLine("登录成功");
}
//否则,执行sql语句失败
else
{
Console.WriteLine("用户名或者密码错误!");
}
}
}
Console.WriteLine("ok");
Console.ReadKey();
漏洞分析:
//主要问题出在sql语句中
"select * from T_Users where UserName=' " +username+"'
and Password=' "+password+" ';
//当输入这样的参数时,
请输入用户名:
admin
请输入密码:
1‘ or '1'='1
登录成功
ok
这表明,即使用户名是正确的,而密码是错误的,却能成功登录
- 当使用断点来执行程序时,发现执行到sql语句时,它变成这样了
select * from T_Users where UserName='admin‘
and Password='1‘ or '1'='1'
当执行or的后面 '1'='1' 时,即整个select语句返回的值是true,表明执行成功
因为使用or时,即使select语句的前面select * from T_Users where UserName='admin‘
and Password='1‘
执行的结果是错误的,即false,然
'1'='1'的运算结果是true
则整个表达式是true 的,---> 这是由于or 逻辑运算符的作用
这就是
SQL注入漏洞攻击
解决方案:
防范注入漏洞攻击的方法:不使用SQL语句拼接,通过参数赋值
- SQL语句使用@UserName表示“此处用参数代替”,向SqlCommand的Parameters中添加参数
- cmd.CommandText="select * from T_Users where UserName=@UserName and Password=@Password";
- cmd.Parameters.Add(SqlParameter("UserName","admin"));
- cmd.Parameters.Add(SqlParameter("Password","123456"));
说明:
- @后面的字符应该符合命名的规则,而不一定与UserName相同
- 这个防范注入漏洞攻击的方法类似于Java的Sql中的预处理?
详细请查看
http://net.itheima.com/