这个函数中的$i一直是个数字啊,switch并不起什么作用啊。

来源:5-3 如何预防SQL注入?预编译机制

rubyc

2018-01-23 09:26

有没有小伙伴帮忙看一下?

写回答 关注

3回答

  • 丑牛小轩
    2018-01-26 14:42:18
    已采纳

    是的 ,这段代码是有问题的 不仅替换语句的那个的地方有问题,switch的参数有问题,而且$args此时被array_shift移空了应该是空数组、那下面过滤的$args[$i]从何而来呢

    可能老师只是想演示一下底层是怎么来绑定参数的原理吧,按这个原来改改代码其实是可以的

  • 慕移动9181930
    2022-03-24 16:00:51
  • zqbinary
    2018-09-29 09:32:35
    $mysqli = new Mysqli('127.0.0.1', 'root', 'root', 'tst');
    $name = $_GET['name'] ?? '';
    $password = $_GET['password'] ?? '';
    function bind_param($sql, $format)
    {
        $args = func_get_args();
        $prepare_sql = array_shift($args);
        $format = array_shift($args);
    
        if (strlen($format) > count($args)) {
            die('缺少参数');
        }
        $i = 0;
        while ($i < strlen($format)) {
            switch ($format[$i]) {
                case 's':
                    $args[$i] = "'" . addslashes($args[$i]) . "'";
                    break;
                case 'i':
                    $args[$i] = intval($args[$i]);
                    break;
                default:
                    break;
            }
            //这段代码也有问题,str_replace 会替换所有的问号
            $prepare_sql = preg_replace('/\?/',  $args[$i], $prepare_sql, 1);
            $i++;
        }
        return $prepare_sql;
    }
    
    echo '<pre>';
    $sql = "select name from user where  name=? and password=?";
    echo $sql;
    echo '<br>';
    $after_prepare = bind_param($sql, 'ss', $name, $password);
    echo 'after prepare:' . $after_prepare;
    echo '<br>';
    $res = $mysqli->query($after_prepare);
    $result = $res->fetch_all();
    if ($result) {
        print('hi ');
        print_r($result);
    } else {
        print('hack failed');
    }
    echo '</pre>';

    注意 

    需要 php7以上,或者自己改代码


web安全之SQL注入

SQL注入是整个WEB安全领域中比较重要的一部分

30618 学习 · 10 问题

查看课程

相似问题