使用mysql_real_escape_string的最佳方法是什么,最初是这样的:
$email = mysql_real_escape_string($_POST['email']);
$qemail = mysql_query ("SELECT email FROM ppl WHERE email='$email'");
或最后是这样的:
$email = $_POST['email'];
$qemail = mysql_query ("SELECT email FROM ppl WHERE email='". mysql_real_escape_string($email) ."'");
整个网站都在使用mysql,所以我必须把它保存在mysql中。问题是,我不想在任何地方使用mysql_real_escape_string(代码看起来令人困惑和可怕)。我想在$ _POST开头才使用它,但这还够吗?
有些人建议最好在查询中使用它,但我不明白为什么。
答案 0 :(得分:3)
您应该将mysql_real_escape_string()
直接放入垃圾箱,然后转移到mysqli
或PDO和learn to use prepared statements。
我之前在A Gentle Introduction to Application Security中提到了这一点,但是使SQL注入成为可能的根本问题是数据和代码的混淆。
Prepared语句将您的查询字符串(SELECT * FROM foo WHERE column = ?
)和您的参数(['foo']
)以单独的数据包发送到数据库服务器。参数从不有机会触摸查询字符串,从而防止首先使SQL注入成为可能的条件。
转义输入和构建查询字符串没有相同的保证。当然,可以安全地做到这一点,但是如果你犯了一个错误并且an unskilled hacker找到它,那么你的整个数据库都是吐司。 (请记住,SQL注入是不容错过的结果。)
答案 1 :(得分:2)
切换到mysql_
以外的更好的解决方案。
话虽如此,如果您必须使用已弃用的mysql_
,我建议您使用sprintf()以提高可读性和易用性:
$qemail = sprintf('SELECT email FROM ppl WHERE email="%s"',
mysql_real_escape_string($_POST['email'])
);
$qr = mysql_query($qemail);
如果您有多个参数,可以有多个%s和其他标记,请参阅sprintf()文档:
$str_qr = sprintf('SELECT * FROM table, WHERE val="%s", val2="%s", someIntegerField=%d',
mysql_real_escape_string($val1),
mysql_real_escape_string($val2),
mysql_real_escape_string($someNumberId),
);
$qr = mysql_query($str_qr);