黑马程序员--学习笔记之SQL注入漏洞攻击

---------------------   Windows Phone 7手机开发    .Net培训  期待与您交流! ----------------------

1、SQL注入漏洞攻击
  • 登录判断:select * from T_Users where UserName=... and Password=...,将参数拼到SQL语句中.
  • 构造恶意的Password: ‘ or ’1'='1
                    if(reader.Read())
{
     Console.WriteLine("登录成功");
}
else
{
     Console.WriteLine("登录失败");
}
  • 防范注入漏洞攻击的方法:不使用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"));
  • 参数在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中添加参数
  1. cmd.CommandText="select * from T_Users where UserName=@UserName and                     Password=@Password";
  2. cmd.Parameters.Add(SqlParameter("UserName","admin"));
  3. cmd.Parameters.Add(SqlParameter("Password","123456"));
说明:
  • @后面的字符应该符合命名的规则,而不一定与UserName相同
  • 这个防范注入漏洞攻击的方法类似于Java的Sql中的预处理?

---------------------   Windows Phone 7手机开发    .Net培训  期待与您交流! ----------------------

详细请查看 http://net.itheima.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值