围绕mysql_real_escape_string()的SQL注入

即使使用mysql_real_escape_string()函数,是否存在SQL注入的可能性?

考虑这个示例情况。SQL是用PHP构造的,如下所示:

$login = mysql_real_escape_string(GetFromPost('login'));$password = mysql_real_escape_string(GetFromPost('password'));
$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";

我听过很多人对我说,像这样的代码仍然很危险,即使使用了mysql_real_escape_string()函数也可以破解。但我想不出任何可能的漏洞?

像这样的经典注射:

aaa' OR 1=1 --

不工作。

你知道任何可能通过上面的PHP代码注入的注入吗?


达令说
浏览 3333回答 3
3回答

有只小跳蛙

请考虑以下查询:$iId = mysql_real_escape_string("1 OR 1=1");    $sSql = "SELECT * FROM table WHERE id = $iId";mysql_real_escape_string()不会保护你免受这种伤害。 您在查询中的变量周围使用单引号(' ')的事实可以保护您免受此攻击。以下是一个选项:$iId = (int)"1 OR 1=1";$sSql = "SELECT * FROM table WHERE id = $iId";

跃然一笑

嗯,除了%通配符之外,除了通配符外,没有什么可以通过它。如果您使用LIKE声明可能会很危险,%因为如果您不对此进行过滤,则攻击者可以将登录作为登录,并且必须强制使用您的任何用户的密码。人们经常建议使用预准备语句使其100%安全,因为数据不会以这种方式干扰查询本身。但是对于这样简单的查询,做类似的事情可能会更有效率$login = preg_replace('/[^a-zA-Z0-9_]/', '', $login);
打开App,查看更多内容
随时随地看视频慕课网APP