样例代码:
$email = "" . $_POST['email'];
$con = mysql_connect("localhost","user","pass")
or die('Could not connect to database.');
mysql_select_db("face", $con);
// Sanitization step
$sanitemail = mysql_real_escape_string($email);
// Is this safe?
mysql_query("INSERT INTO landing_oct_2010 (email) VALUES ('$sanitemail');");
我想知道,对于这个简单的任务,仅使用
mysql_real_escape_string
是否足以完全阻止至少注入式SQL攻击,或者是否应该采取其他预防措施。我在此示例中收集电子邮件地址的事实是偶然的。如果我知道我正在使用电子邮件地址,则只需输入一个正则表达式和一些DNS检查,然后在其中也内置验证即可。但是,我想着眼于一般的问题:单一的卫生功能是否足够?
最佳答案
是的,足够了。好吧,有点。
如果正确且一致地使用mysql_real_escape_string
,足以防止SQL注入。该功能(与mysql_escape_string
不同)考虑了连接的字符集,因此,只要您实际上使用正确的字符集进行通信,它就可以在任何站点上使用。
但是,在过去,转义例程中的bugs have existed可能潜在地导致SQL注入仍然可行(如果条件正确)。
更好的选择是将参数化查询与MySQLi库一起使用,因为这样就完全不需要转义。参数化查询基本上是通过将数据与查询结构分离来工作的,这反过来意味着不可能进行SQL注入。在实现方面,对于数据库开发人员而言,引入一个仍然允许SQL注入的错误也更加困难,这也是因为查询结构是单独给出的。