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注入
30728 学习 · 10 问题
相似问题