• SQL注入


    参考简书: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.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。

  • 相关阅读:
    Postgres 的 Range 类型
    Postgres 的 Array 类型
    joi库 学习笔记
    nginx官方文档 之 http负载均衡 学习笔记
    pm2 官方文档 学习笔记
    SSH 学习笔记
    防止活动上线时 微信openid 被伪造的解决办法
    PHP 中 var_export、print_r、var_dump 调试中的区别
    nake_api_protect 请求保护器——防止请求被恶意刷
    接口的防刷办法
  • 原文地址:https://www.cnblogs.com/bneglect/p/10915063.html
Copyright © 2020-2023  润新知