sql攻击的总体思路+攻击实例+防止方法

一、SQL注入攻击的总体思路

1.寻找到SQL注入的位置

2.判断服务器类型和后台数据库类型

3.针对不同的服务器和数据库特点进行SQL注入攻击

 

二、SQL注入攻击实例

比如在一个登录界面,要求输入用户名和密码:

可以这样输入实现免帐号登录:

用户名: ' or 1 = 1 --

密 码:

点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢? 下面我们分析一下:

从理论上说,后台认证程序中会有如下的SQL语句:

String sql = "select * from user_table where username=

' "+userName+" ' and password=' "+password+" '";

当输入了上面的用户名和密码,上面的SQL语句变成:

SELECT * FROM user_table WHERE username=

'’or 1 = 1 -- and password='’

分析SQL语句: 

条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;

然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

 

这还是比较温柔的,如果是

用户名: ' ;drop database (DB Name) --

密 码:

则执行如下:

SELECT * FROM user_table WHERE

username='' ;DROP DATABASE (DB Name) --' and password=''

其后果不堪设想

 

二、防止SQL注入办法

1.(简单又有效的方法)PreparedStatement
使用:采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。
好处:(1)代码的可读性和可维护性 (2)PreparedStatement尽最大可能提高性能 (3)最重要的一点是极大地提高了安全性
原理:sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.
2种方法:
a.使用PDO的prepare()+execute()
$res = $pdoDB->prepare('select * from users WHERE age = :age')->execute([':agve' => $age]));
foreach ($res as $row) {
    // do something with $row
}
b.使用mysqli的prepare()+bind_param()+execute()
$resQuery = $mysqiDB->prepare('select * from users where age = ?')->bind_param('s', $age)->execute();
$res = $resQuery->get_result();
while ($row = $res->fetch_assoc()) {
    // do something with $row
}

2.使用正则表达式过滤传入的参数
检测SQL meta-characters的正则表达式 : /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix
修正检测SQL meta-characters的正则表达式 : /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(:))/i
典型的SQL 注入攻击的正则表达式 : /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
检测SQL注入,UNION查询关键字的正则表达式 : /((\%27)|(\'))union/ix(\%27)|(\')
检测MS SQL Server SQL注入攻击的正则表达式: /exec(\s|\+)+(s|x)p\w+/ix

3.字符串过滤
1)、mysql_real_escape_string() 
SQL语句如果有类似这样的写法:"select * from cdr where src =".$userId; 改成 "select * from cdr where src =".mysql_real_escape_string($userId);
2)、addslashes(),htmlentities()
变量=addslashes(变量);//对特殊字符强行加\,特殊字符是单引号(')、双引号(")、反斜线(\)与 NULL
变量=htmlentities(变量);//所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312) 
3)、自定义过滤函数
//这段不知道对不对,true说明有sql注入,false则是正常
function bool_sqlinj($str)
{
    $pregArr = ["and", "exec", "insert", "select", "delete", "update", "count", "chr", "mid", "master", "truncate", "char", "declare", "or", "+", "-", "*", "%", "'", ",", ";"];
    $pregCount = count($pregArr);
    $i = 0;
    whie ( $i < $pregCount) {
        if (strpos($str, $pregArr[$i])) return true;
        $i++;
    }
    return false;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值