MySQL QUOTE() 与 mysql_real_escape_string()?

Posted

技术标签:

【中文标题】MySQL QUOTE() 与 mysql_real_escape_string()?【英文标题】:MySQL QUOTE() vs mysql_real_escape_string()? 【发布时间】:2012-07-23 10:34:03 【问题描述】:

mysql 中,QUOTE()mysql_real_escape_string() 有什么区别?从 MySQL 文档中,我知道以下内容:

QUOTE()

写入 SQL 查询 转义反斜杠、单引号、NUL、CTRL+Z 返回单引号字符串 行为依赖于 MySQL 服务器的字符集

mysql_real_escape_string()

在执行查询之前用 C/C++ 编写,允许在提交之前读取/修改转义字符串 与QUOTE()相比使用起来非常不方便 转义反斜杠、单引号、NUL、CTRL+Z 和 双引号、\n 和 \r 显然添加了更多引号以使字符在日志文件中易于阅读 行为依赖于 MySQL 服务器的字符集

忽略日志,转义\n\r 字符有用吗?有了这两个功能,客户端/服务器功能效率有区别吗?如果开发人员希望在输入查询之前处理转义字符串,mysql_real_escape_string() 听起来很有用。但是,QUOTE() 没有提供最安全可靠的字符串转义方法吗?

我想知道是否应该将QUOTE() 用于所有语言的所有查询,而忘记使用特定于语言的函数转义字符串。


QUOTE() mysql_real_escape_string() String Literals

【问题讨论】:

【参考方案1】:

QUOTE() 似乎是要在构造其他 SQL 语句的 SQL 语句中使用。如果您不在 SQL 范围内,则应使用 mysql_real_escape_string()

[...] 在 C 程序中,您可以使用 mysql_real_escape_string() C API 函数来转义字符。 [...] 在构造其他 SQL 语句的 SQL 语句中,您可以使用 QUOTE() 函数。

正如String Literals (MySQL Manual)底部的解释。

【讨论】:

【参考方案2】:

QUOTE() 已经在查询中,所以它就像你没有放任何东西一样容易突破。 mysql_real_escape_string 对于让任意字符串安全地插入查询至关重要。

使用某种别名可以很容易地解决函数名笨拙的问题。我不是 C/C++ 用户,但它没有宏,你可以用它来编写你想要的任何东西,它会被长函数名替换吗?

【讨论】:

所以QUOTE() 不是注射安全的? QUOTE() 什么时候适合使用?我担心的是功能,而不是便利。你说的也是正确的,因为 C++ 有宏。

以上是关于MySQL QUOTE() 与 mysql_real_escape_string()?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 累积产品组按

protected 成员与派生类

宽字节注入原理

宽字节注入原理

MySQL 错误 1449:指定为定义者的用户不存在

转宽字节注入详解