代码之家  ›  专栏  ›  技术社区  ›  Michael Borgwardt

mysql_real_escape_string()做什么?addslashes()不做什么?

  •  20
  • Michael Borgwardt  · 技术社区  · 17 年前

    为什么我们需要一个特定于数据库的函数,比如mysql_real_escape_string()?它能做什么?addslashes()不能?

    暂时忽略参数化查询的高级替代方法,使用addSlashes()的webapp是否仍然容易受到SQL注入的攻击,如果是,如何操作?

    11 回复  |  直到 13 年前
        1
  •  19
  •   Chris KL    17 年前

    在处理多字节编码的字符串时,加斜杠通常不够好。

        2
  •  19
  •   Ólafur Waage    17 年前

    它将斜线添加到:

    \x00, \n, \r, \, ', " and \x1a. characters.
    

    其中addslashes只将slashes添加到

    ' \ and NUL
    

    Ilias article 也非常详细地介绍了它的功能

        3
  •  5
  •   bobince    17 年前

    葛兰素史克严厉的否决回答实际上有点正确。

    标准的SQL使用double来转义字面撇号。MySQL使用反斜杠进行转义的非标准设置是默认设置,但它可以被禁用,而且经常被禁用,特别是在SQL_模式的ANSI中。

    在这种情况下,只有双重语法才有效,任何使用addslashes(或其他特殊转义方法)的应用程序都将中断。mysql_real_escape_字符串将使用最适合连接SQL_模式的任何转义方法。

    如果您仍在使用那些讨厌的东亚编码,这些编码会重复使用较低的128个字符,那么多字节编码问题也很重要,但实际上您希望使用UTF-8。\另一方面,N-escaping并不需要担心,因为MySQL可以完美地处理语句中的原始换行。

        4
  •  4
  •   bobobobo    13 年前

    mysql_real_escape_string 更多 addslashes 做。

    addslashes操作纯ASCII,而不了解数据库。它逃脱了:

    • ' 艾斯 \'
    • " 艾斯 \"
    • \ 艾斯 \\
    • ASCII 0 艾斯 \0 .

    mysql_real_escape_字符串 其目的是“创建可在SQL语句中使用的合法SQL字符串。”mysql_real_escape_string考虑了 连接的当前字符集 (这就是为什么您必须始终传递有效的$mysql对象)。

    它执行以下操作(摘自mysql c api文档):

    • 编码: \ , , ASCII , \n , \r Control+Z 在某种程度上不会引起问题
    • 确保一个 byte终止字符串(在c api中)
    • 如果$mysql中链接到的db使用宽字符集,则可以执行多字节(ASCII)到宽字符的转换。

    我真的不知道PHP如何在内部存储字符串,但重点是当您使用 mysql_real_escape_string . 我想主要的区别是 mysql_real_escape_字符串 考虑连接的字符集 在哪里 转义 无法(它甚至不知道您连接的是什么数据库)。

        5
  •  3
  •   GEOCHET S.Lott    17 年前

    somedb_real_escape_string() 是特定于数据库的, addslashes() 不是。

    对于MySQL,这意味着:

    mysql_real_escape_string()调用 MySQL的库函数 mysql_real_escape_string,其中 将反斜杠前置到以下位置 字符:\x00、\n、\r、\、'、'和 \x1a。

    (来自手册。)

        6
  •  2
  •   Your Common Sense    13 年前

    为什么我们需要一个特定于数据库的函数,比如mysql_real_escape_string()?

    事实上,大多数时候我们没有。
    这个函数对于一些极为罕见的编码是必需的,并且稍微美化mysql日志和转储。

    使用addslashes()的webapp是否仍然容易受到SQL注入的攻击?

    只要它使用任何单字节字符集或utf8- 使用addslashes()是完全安全的。

    它能做什么?addslashes()不能?

    它可以保护SQL 字符串文字 以防一些罕见的编码。

    但是,它不能自己去做。 必须使用 mysql_set_charset() 功能优先。如果没有使用此功能, mysql_real_escape_string() 行为方式与 addslashes() 在字符集处理方面-没有任何区别 .

        7
  •  1
  •   nabrond    17 年前

    我所知道的唯一真正的区别是mysql_real_escape_string()在转义输入字符串时会考虑数据库的字符集。这两个函数都不会转义通配符%和u,它们仍然会使脚本对某些SQL注入开放。

        8
  •  1
  •   Rob    17 年前

    根据 PHP manual :

    mysql_real_escape_string()调用mysql的库函数mysql_real_escape_string,该函数将反斜杠加在以下字符前:\x00、\n、\r、\、'、'和\x1a。

        9
  •  1
  •   Alana Storm    17 年前

    PHP的mysql_real_escape_string函数或多或少, 询问MySQL需要转义哪些字符 ,其中addslashesses函数只在任何单引号(“)、双引号(“)、反斜杠()或nul(空字节)字符前面添加反斜杠。

    这两个实际效果是,addslashes在处理多字节字符时往往效果不佳,更重要的是,通过询问MySQL需要转义哪些字符,可以避免将来可能出现的兼容性。使用assslashes有点像将两个特定字符硬编码到转义序列中。

        10
  •  0
  •   greyfade    17 年前

    它应该以其他引用工具所不具备的方式为MySQL转义字符串。

    然而,更可取的是 使用mysqli接口 ,并使用参数化的准备查询,而不是尝试确保所有字符串都正确转义。使用参数化查询可以避免这种混乱的字符串工作,并大大降低SQL注入的风险。

    编辑:我将澄清一下为什么我考虑引用一个坏主意:很容易忘记何时何地需要引用-变量是字符串还是数字,是否已被引用等等。参数化查询 没有这些问题 报价的必要性是 完全地 排除。

        11
  •  0
  •   Hafiz    15 年前

    根据我的理解mysql_real_escape_string()做的更精确,因为它与db通信,首先检查需要编码的内容,然后相应地编码,不是吗?因此,它的工作效率更高

    为什么你要先做addslashes,然后在显示数据之前删除这个slashes,但addslashes的效率不如mysql_real_escape_string,如果你使用的是mysql_real_escape_string,就像使用db函数进行查询一样,或者我认为pdo和prepare是更好的方法,因为mysql_real_escape_string是db特有的。