rubyc
2018-01-23 09:26
有没有小伙伴帮忙看一下?
是的 ,这段代码是有问题的 不仅替换语句的那个的地方有问题,switch的参数有问题,而且$args此时被array_shift移空了应该是空数组、那下面过滤的$args[$i]从何而来呢
可能老师只是想演示一下底层是怎么来绑定参数的原理吧,按这个原来改改代码其实是可以的
$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注入
30618 学习 · 10 问题
相似问题