利用场景:
1,网站对客户端输入的引号等字符进行了转义
2,网站数据库采用了gbk编码
代码分析:
<?php
//header("Content-Type: text/html; charset=gb2312");
$id=isset($_GET['id'])?addslashes($_GET['id']):11;//使用addslashes()对参数$id进行了过滤
$con=mysqli_connect('localhost','root','root');
mysqli_select_db($con,'sql');
$sql="select * from users where id='$id'";
echo "sql语句是:".$sql.'<br />';
$result=mysqli_query($con,$sql);
if (!$result) {
echo "查询失败";
}
while ($row=mysqli_fetch_row($result)) {
echo "id 是".$row[0].'<br>';
echo "名字是".$row[1].'<br>';
}
mysqli_close($con);
?>
可以看到在第二行addslashes($_GET['id']),使用了addslashes()函数对传入的参数$id的值进行了过滤。
addslashes()函数的用法
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
测试
1,正常:http://127.0.0.1/sqlunion.php?id=11
2,过滤反斜杠(\):http://127.0.0.1/sqlunion.php?id=11\
3,过滤双引号("):http://127.0.0.1/sqlunion.php?id=11"
无法进行测试:可以看到由于引入了反斜杠(\),无法让sql语句报错。
设置数据库为gbk编码
直接修改数据库编码不成功的可以在代码中加上这一句:
访问:127.0.0.1/sqlunion.php?id=5%df'
5%df'在传入后变成了5%df\' 而\的url编码是%5c 所以最后变成了 5%df%5c‘ 变成了 5運
而多了的一个单引号导致了报错。
又可以愉快的测试了: