SQL注入攻击及防范

一.什么是SQL注入
1.SQL注入的定义
     SQL注入(SQL Injection) 利用了程序中的SQL的漏洞,进行攻击的方法。

2.SQL注入举例
  1)利用SQL语法错误获取数据库表的结构信息:
      攻击者要成功实施一次攻击,需要了解哪个表和列可用。SQL Server默认的行为是,当不正确查询运行时返回错误消息。

      例如攻击者输入用户名:“'having 1=1;--”,数据库将返回包含表名和代码查询中第一列的错误消息;

      而group by语句可以更进一步确定查询中的列:“'group by 表名.列名 having 1=1;--”,

      数据库将返回查询中的下一列;攻击者可以继续附加group by语句,直到不再收到错误消息。
  2)获取数据库内容信息:
      攻击者可以利用变换错误消息,获取数据库中存储的数据,

      例如输入用户名:“'union select min(username),1 from users where username>1;--”,

      数据库将返回表中的第一个用户名。

      攻击者可以使用同样的SQL注入,用password代替username得到用户账户的密码,以此类推,可以获取数据库表中的每条记录。
  3)使用的 '-- 或 ' or 1=1-- 缩短查询条件
       select username from users
       Where username=’admin’--’and password=’123’
  4)修改数据库表的内容:
       攻击者通过“';”来结束一条查询语句,然后附加破坏性的SQL语句,

       例如:“';delete from Accounts”或“';insert into Users (……)”。
       select username from users
       Where username=’admin’;drop table users --’
       and password=’123’
5)通过SQL访问操作系统
Select username from users
Where username=’admin’; EXEC xp_cmdshell 'net user haker 123456 /add’--’ and password=’123’

 
二.如何防范SQL注入
1.避免拼接SQL
2.使用存储过程
3.使用参数化SQL
     SqlParameter可以提供类型和长度检查,并自动转义用户输入。
     Select username from users where username=@username 
     And password=@password
4.限制长度
5.录入验证,类型检查
     Select title from news where id=123; delete from news
6.过滤或转义危险字符
    inputSQL.Replace("'", "''");
    ’  ;  --   /*  */  xp_
7.在服务器上处理错误:
    成功的SQL注入攻击不一定导致错误;导致错误的SQL注入通常是攻击者正在收集数据库信息,是攻击的前兆。

    在 try..catch..finally中处理错误;
    <compilation debug="false"/>;
    <customErrors mode="RemoteOnly"/>。
8.程序所使用的数据库帐户最少的权限

一.什么是SQL注入
1.SQL注入的定义
     SQL注入(SQL Injection) 利用了程序中的SQL的漏洞,进行攻击的方法。

2.SQL注入举例
  1)利用SQL语法错误获取数据库表的结构信息:
      攻击者要成功实施一次攻击,需要了解哪个表和列可用。SQL Server默认的行为是,当不正确查询运行时返回错误消息。

      例如攻击者输入用户名:“'having 1=1;--”,数据库将返回包含表名和代码查询中第一列的错误消息;

      而group by语句可以更进一步确定查询中的列:“'group by 表名.列名 having 1=1;--”,

      数据库将返回查询中的下一列;攻击者可以继续附加group by语句,直到不再收到错误消息。
  2)获取数据库内容信息:
      攻击者可以利用变换错误消息,获取数据库中存储的数据,

      例如输入用户名:“'union select min(username),1 from users where username>1;--”,

      数据库将返回表中的第一个用户名。

      攻击者可以使用同样的SQL注入,用password代替username得到用户账户的密码,以此类推,可以获取数据库表中的每条记录。
  3)使用的 '-- 或 ' or 1=1-- 缩短查询条件
       select username from users
       Where username=’admin’--’and password=’123’
  4)修改数据库表的内容:
       攻击者通过“';”来结束一条查询语句,然后附加破坏性的SQL语句,

       例如:“';delete from Accounts”或“';insert into Users (……)”。
       select username from users
       Where username=’admin’;drop table users --’
       and password=’123’
5)通过SQL访问操作系统
Select username from users
Where username=’admin’; EXEC xp_cmdshell 'net user haker 123456 /add’--’ and password=’123’

 
二.如何防范SQL注入
1.避免拼接SQL
2.使用存储过程
3.使用参数化SQL
     SqlParameter可以提供类型和长度检查,并自动转义用户输入。
     Select username from users where username=@username 
     And password=@password
4.限制长度
5.录入验证,类型检查
     Select title from news where id=123; delete from news
6.过滤或转义危险字符
    inputSQL.Replace("'", "''");
    ’  ;  --   /*  */  xp_
7.在服务器上处理错误:
    成功的SQL注入攻击不一定导致错误;导致错误的SQL注入通常是攻击者正在收集数据库信息,是攻击的前兆。

    在 try..catch..finally中处理错误;
    <compilation debug="false"/>;
    <customErrors mode="RemoteOnly"/>。
8.程序所使用的数据库帐户最少的权限