我们知道,在php脚本中执行mysql之前,所有的用户输入必须通过mysql_real_escape_string()
函数转义。并且知道该功能在用户输入中的任何'
或"
字符之前插入\。假设以下代码:mysql_real_escape_string()对十六进制编码数据不安全吗?
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// Query database to check if there are any matching users
$query = "SELECT * FROM users WHERE user='".mysql_real_escape_string($_POST['username']."' AND password='".mysql_real_escape_string($_POST['password']."'";
mysql_query($query);
// This means the query sent to MySQL would be:
echo $query;
此代码是安全的。
但我发现如果用户以十六进制格式输入她的输入,那么mysql_real_escape_string()
不能做任何事情,用户可以轻松地执行她的SQL注入。在波纹管27204f522027273d27
是相同' OR ''='
但在十六进制格式化,没有问题的SQL执行:
$_POST['username'] = 'aidan';
$_POST['password'] = "27204f522027273d27";
// Query database to check if there are any matching users
$query = "SELECT * FROM users WHERE user='".mysql_real_escape_string($_POST['username']."' AND password='".mysql_real_escape_string($_POST['password']."'";
mysql_query($query);
// This means the query sent to MySQL would be:
echo $query;
但是,这是否是真实的,如果答案是肯定的我们如何防止SQL注入这样?
当处理诸如漏洞之类的问题时,最好提供一段代码样本(如果有必要,请简化说明问题)并输入引发您遇到的问题的代码。 –
请演示攻击者如何通过使用十六进制符号来绕过“mysql_real_escape_string”。 – deceze
@deceze:一个十六进制编码如何用来规避转义的例子[可以在Rook的答案中找到](http://stackoverflow.com/a/4262043/106769)。 –