前提:
以下函数能绕过都是因为开发者代码能力不足或疏忽造成的,存在一定限制性
str_replace()函数
例如:
$x=str_replace("'","\\'",$_GET['x']);
echo "select name from table where id='{$x}';";
注意:\\在MySQL里是用于转义特殊字符
解题思路:
根据题目输入x=\',就能被转义为\\',从而使单引号逃逸,也就是说逗号还是替换为逗号,过滤函数没有起到作用。
htmlspecialchars()函数
例如:
$x=htmlspecialchars($_GET['x']);
echo "select name from table where id='{$x}';";
注意:htmlspecialchars函数多常用于防止xss攻击,htmlspecialchars函数要转义单引号需要设置第二个参数为ENT_QUOTES,转义双引号需要设置第二个参数为ENT_NOQUOTES
解题思路:
看题目知htmlspecialchars函数没有设置第二个参数,所以并没有起到转义的作用。
is_numeric()函数
例如:
try{
if(!is_numeric($_GET['x'])){
header("Status: 404 Not found");
}
echo "select name from table where id='{$_GET['x']}';";
}
catch(exception $e){
echo 1;
}
解题思路:
虽然is_numeric函数检测到输入的参数不是数字或数字字符串就会给http头部添加404的状态码,但没有添加exit代码使其中断执行,所以并不影响到php文件的执行