参考简书:https://www.jianshu.com/p/078df7a35671(这个有form表单注入,绕过验证登录后台实例)

参考原文:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html

从根本上防止SQL注入:https://www.zhihu.com/question/22953267 

 

SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。换句话说:网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

假设我们在浏览器中输入URL  www.bolog.com,由于它只是对页面的简单请求无需对数据库动进行动态请求,所以它不存在SQL Injection,当我们输入www.bolog.com?id=23时,我们在URL中传递变量id,并且提供值为23,由于它是对数据库进行动态查询的请求(其中?id=23表示数据库查询变量),所以我们可以在该URL中嵌入恶意SQL语句

 1 <?php
 2 $id = isset($_GET['id']) ? $_GET['id'] : 1;
 3 echo '接收到的ID为'.$id;echo '<br>';
 4 
 5 $link = @mysqli_connect('localhost','root','','user') or die('connect mysql is error');
 6 mysqli_set_charset($link,'utf8');
 7 $sql = 'SELECT * FROM user WHERE id = '.$id;
 8 $queryResult = mysqli_query($link,$sql);
 9 // var_dump($queryResult);die;
10 if($queryResult && mysqli_num_rows($queryResult)){
11     $rows = [];
12     while($row = mysqli_fetch_assoc($queryResult)){
13         $rows[] = $row;
14     }
15     echo 'ok';
16     echo '<br>用户信息:';
17     var_dump($rows);
18 }else{
19     echo 'error';
20 }
21 
22 
23 mysqli_close($link);
24 
25 ?>
26 
27 <!DOCTYPE html>
28 <html>
29 <head>
30     <title>sql injection</title>
31 </head>
32 <body>
33     <form action="test.php" method="get">
34         <a href="test.php?id=7">查询user表ID=7的用户</a>
35     </form>
36 </body>
37 </html>
View Code

以上就是一个普通查询数据库操作,然后在url地址栏中加入一个条件,结果数据库中的所有信息全部查询出来了,如下图

通过一个简单的恒真表达式就可以进行了一次简单的攻击,如何找出真正的表名,按照原文的思路没有找到,技术不够,以后慢慢找吧 -_# .  除了这些方法应该还有其他的注入攻击好像,用户在表单中输入信息的时候,比如根据用户输入的用户名去数据库中查询。这个应该也是可以做手脚的。

接下来看看如何预防SQL注入攻击

1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。

2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。