3

在我读过的每一篇博客/文章/问答中,没有人建议检查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');

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

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)).'")');

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

我错过了什么?我是在安全地玩还是我在偏执狂?:)

4

3 回答 3

2

从某种意义上说,您缺少一些东西,因为不再建议使用 mysql_系列函数。而是使用mysqliPDO。这两者都提供参数化查询,它们会自动为您转义您的输入数据。

于 2012-04-25T12:18:36.377 回答
0

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

我也认为避免发送nothingmysql 查询绝对是一个好习惯(几乎就像你不想发送一个nothing有价值的$_POST变量一样)。

于 2012-04-25T12:11:44.247 回答
-1

我注意到你提到的问题:

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

$db = mysql_connect();

好吧,此时您绝对应该检查连接是否成功。此外,通过良好的数据库抽象层,您可以防止用户“忘记”连接到数据库(因为他不必手动执行此操作)。(1)。

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

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

于 2012-04-25T12:16:41.070 回答