我应该在哪里放置mysql_real_escape_string?

时间:2016-04-21 14:30:31

标签: php mysql security mysql-real-escape-string

使用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开头才使用它,但这还够吗?

有些人建议最好在查询中使用它,但我不明白为什么。

2 个答案:

答案 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注入是不容错过的结果。)

TL; DR - Just use Prepared Statements

答案 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);