参考简书: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>
以上就是一个普通查询数据库操作,然后在url地址栏中加入一个条件,结果数据库中的所有信息全部查询出来了,如下图
通过一个简单的恒真表达式就可以进行了一次简单的攻击,如何找出真正的表名,按照原文的思路没有找到,技术不够,以后慢慢找吧 -_# . 除了这些方法应该还有其他的注入攻击好像,用户在表单中输入信息的时候,比如根据用户输入的用户名去数据库中查询。这个应该也是可以做手脚的。
接下来看看如何预防SQL注入攻击:
1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。