zoukankan      html  css  js  c++  java
  • UCHome: SQL注入式攻击

    所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。

    上面是在百度百科中搜到的一段话,这里主要是想具体演示一下这个过程。

    1. 准备数据库,在MySQL的test数据库中执行如下SQL语句:

    CREATE TABLE `test`.`admin_user` (
    `login` VARCHAR( 20 ) NOT NULL ,
    `password` VARCHAR( 20 ) NOT NULL 
    ) ENGINE = InnoDB;
    
    INSERT INTO admin_user(login, password) VALUES('admin', 'admin');
    INSERT INTO admin_user(login, password) VALUES('user1', 'pass1');
    INSERT INTO admin_user(login, password) VALUES('user2', 'pass2');
    INSERT INTO admin_user(login, password) VALUES('user3', 'pass3');

    2. 建立测试用PHP文件test.php:

    <?php
    
    if (isset($_REQUEST['submit'])) 
    {
        $login = $_REQUEST['login'];
        
        $sql = "SELECT login, password FROM admin_user WHERE login = '$login'";
        print_r($sql);
        
        $db = mysql_connect('localhost', 'root', '');
        mysql_select_db('test', $db);
        $result = mysql_query($sql, $db);
        echo '<table border=3><tr><td>Login</td><td>Password</td></tr>';
        while ($row = mysql_fetch_assoc($result)) {
            echo '<tr>';
            echo '<td>' . $row['login'] . '</td>';
            echo '<td>' . $row['password'] . '</td>';
            echo '</tr>';
        }
        echo '</table>';
        
        ?> <?php
    }
    else
    {
        ?> 
          <form method="post">
              Login: <input type="text" name="login" value="" /><br/>
              <input type="submit" name="submit" value="Submit" /><br/>
          </form>
        <?php
    }

    PHP文件test.php的本意是当使用者在HTML表单中输入login后,服务器在后台数据库中查询到满足条件的一笔资料然后返回给浏览器。比如我们正常的输入$login="user1",则组合后的SQL语句是:

    SELECT login, password FROM admin_user WHERE login = 'user1' 

    这个时候结果是正确的,没有问题。


    那SQL注入式攻击是怎样的呢? 我们尝试这样输入:$name="a' or '1'='1"(注意单引号),那生成的SQL语句就变成了:

     SELECT login, password FROM admin_user WHERE login = 'a' or '1'='1'

    结果将admin_user这个表里面的所有数据显示了出来。


    那如何解决这个问题呢?简单,看这篇文章http://www.nextphp.com/article.php?id=114,使用mysql_escape_string()或者addslashes()就可以了。修改上面的取值代码:

    $login = mysql_escape_string$_REQUEST['login']);

    再次输入$name="a' or '1'='1",这个时候生成的SQL语句就没有问题了:

    SELECT login, password FROM admin_user WHERE login = 'a\' or \'1\'=\'1'
  • 相关阅读:
    JAVA多线程理论!
    JAVA理论!
    对于PHP的基础理论!
    C#中的ArrayList
    C#中HashTable的用法
    用C#写经理评分系统
    C#数据类型
    jQuery小测的总结
    用jQuery模拟淘宝购物车
    JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画
  • 原文地址:https://www.cnblogs.com/eastson/p/2837895.html
Copyright © 2011-2022 走看看