【问题标题】:What is the difference between mysql_real_escape_string and addslashes?mysql_real_escape_string 和 addlashes 有什么区别?
【发布时间】:2008-09-18 09:32:48
【问题描述】:

mysql_real_escape_stringaddslashes都是用来在数据库查询前转义数据,那有什么区别呢? (本题与参数化查询/PDO/mysqli无关)

【问题讨论】:

标签: php


【解决方案1】:

string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
mysql_real_escape_string() 调用 MySQL 的库函数 mysql_real_escape_string,该函数在以下字符前添加反斜杠:\x00、\n、\r、\、'、" 和 \x1a。

string addslashes ( string $str )
在需要在数据库查询等中引用的字符之前返回带有反斜杠的字符串。这些字符是单引号 (')、双引号 (")、反斜杠 (\) 和 NUL(NULL 字节)。

1234565>

它们影响不同的角色。 mysql_real_escape_string 特定于 MySQL。 Addslashes 只是一个通用函数,它可能适用于其他事物以及 MySQL。

【讨论】:

  • 您只是复制了定义,并没有真正回答实际差异的问题,即,什么是用法,什么是陷阱,其中一种功能比另一种更好。更好的答案在这里:stackoverflow.com/a/3473077/1335996
  • 再读一遍,你会注意到最后一段我说过不同的字符会受到影响,它总结了引用的文档。您会看到问题已得到解答。这个问题没有问“为什么一个比另一个更好”或“好处和陷阱”。链接的答案确实更深入,如果您仍然不清楚上述内容,如果值得一读,但我认为没有必要尝试在我的答案中找漏洞。
【解决方案2】:

mysql_real_escape_string() 具有额外的好处,即通过可选的 link_identifier 参数相对于数据库的字符集正确转义文本输入。

字符集意识是一个关键的区别。 addslashes() 将在每个要转义的字符的每八位二进制表示之前添加一个斜杠。

如果您使用某种形式的多字节字符集,尽管可能只是由于字符集设计不佳,16 位或 32 位字符表示的一半或两半与字符 addslashes() 会添加一个斜线。

在这种情况下,您可能会在不应转义的字符前添加斜杠,或者更糟糕的是,您可能会在十六(或三十二)位字符中间添加斜杠,这会破坏数据。

如果您需要转义数据库查询中的内容,您应该尽可能使用mysql_real_escape_string()。如果您确定数据库或表仅使用 7 位或 8 位 ASCII 编码,addslashes() 很好。

【讨论】:

    【解决方案3】:

    案例 1:

    $str = "input's data";
    
    print mysql_real_escape_string($str);      input\'s data
    
    print addslashes($str);                    input\'s data;
    

    案例 2:

    $str = "input\'s data";
    
    print mysql_real_escape_string($str);      input\'s data
    
    print addslashes($str);                    input\\'s data;
    

    【讨论】:

      【解决方案4】:

      mysql_real_escape_string 似乎是二进制安全的 - 文档指出:

      如果要插入二进制数据,必须使用该函数。

      我认为始终使用 mysql_real_escape_string 可能比使用 addlashes 更安全。

      【讨论】:

      • 我认为使用参数化查询可能更安全,尽管提问者已经排除了这一点。
      • @Hank Gay:同意,但两者中,mysql_real_escape_string 是可取的,
      【解决方案5】:

      mysql_real_escape_string用于接收二进制数据,addslashes用于文本输入。

      您可以在这里看到不同之处:mysql-real-escape-stringaddslashes

      【讨论】:

        猜你喜欢
        • 2013-04-17
        • 1970-01-01
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        相关资源
        最近更新 更多