为什么检查mysql_real_escape_string()的返回

时间:2012-04-25 12:09:02

标签: php mysql security

在我读过的每篇博客/文章/ Q& A中,没有人建议检查mysql_real_escape_string()返回的值。

我看到它的方式,此检查对于确保数据一致性非常重要,因为如果此函数失败,则插入数据库中的值将是错误的:布尔值FALSE类型转换为字符串,从而产生空字符串,而不是你所期望的。

根据文件:

Returns the escaped string, or FALSE on error. 

A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn't defined, the last MySQL connection is used. 

如果您查看日志以查看发生的情况,警告就会很好,但不会阻止它发生。

我知道失败的变化非常少,但如果您的应用程序应该预期至少有一次更改。

如果出现以下情况,此功能将失败:

  • 开发人员在调用此函数之前未连接到数据库
  • 在调用此函数之前与数据库的连接失败
  • 服务器的内存(mysql客户端所在的位置)很低,无法复制字符串以进行转义
  • ...

这是"正常"的例子。用法:

$db = mysql_connect() or die('Cannot connect to database');
$value = mysql_real_escape_string($_POST['value'], $db);
mysql_query('insert into tablex (value) values ("'.$value.'")', $db) or die('Cannot insert data in database');

我正在使用这样的东西(在我的OO封装器中用于mysql):

class mywrapper{
    // ... [code ...]

    // $this->db is the mysql link identifier
    public function escape($string)
    {
        if(mysql_real_escape_string($string, $this->db) === false)
        {
            throw new Exception('Some message');
        }
    }
} // end class    

    // I'm calling it as 
    // $myWrapper->insert('insert into tablex (value) values ("'.($myWrapper->escape($value)).'")');

这将抛出异常处理程序将捕获的异常,最重要的是我阻止在数据库中插入误报值,确保数据的一致性。

我错过了什么?我玩得安全还是我在变异? :)

3 个答案:

答案 0 :(得分:2)

从某种意义上说,你错过了一些东西,因为它是no longer recommended to use the mysql_系列的功能。而是使用mysqliPDO。这两个都提供了参数化查询,它们将自动为您输入数据。

答案 1 :(得分:0)

不,我不认为你是偏执狂。 (或者我们都是偏执狂)

我也认为避免在mysql查询中发送nothing绝对是一种好习惯(就像你不想发送一个nothing$_POST变量一样)

答案 2 :(得分:-1)

我注意到你提到的问题:

  

这是“正常”用法的例子:

     

$ db = mysql_connect();

那么,此时你一定要检查连接是否成功。另外,通过良好的数据库抽象层,你可以防止用户“忘记”连接到数据库(因为他从来不必手动连接) 。 (1)。

如果您在此期间失去连接,那么您的查询将失败,因此您发送的内容无关紧要(2)。

mysql_real_escape_string在客户端完成,因此mysql服务器的内存使用不是问题(3)。