【问题标题】:How to escape ' (apostrophe) in mysql?如何在mysql中转义'(撇号)?
【发布时间】:2013-05-21 17:17:06
【问题描述】:

当我从 Xml 读取一些文本并将其放入数据库时​​,如果文本包含 '(撇号) ,我会收到错误消息。当我插入数据库时​​如何克服这个问题。

【问题讨论】:

  • 不要转义 - except 如果编写原始 SQL 以进行手动处理。 Use placeholders for all other cases(适应语言)。另外,请参阅string literal syntax 的官方 MySQL 参考。
  • 对您正在使用的编程语言使用官方转义机制。不要手动转义,因为还有其他字符也需要转义,并且几乎总是手动执行此类操作有错误,会让你容易受到攻击。
  • 简单!!使用准备好的语句。

标签: mysql xml escaping


【解决方案1】:

在撇号之前添加一个 \(反斜杠)。使用您的文本编辑器查找并替换所有 '\' 应该可以工作。小心不要弄乱 XML 结构。

例如。

约翰的

需要

约翰的

您也可以使用 PHP 或 C# 为您转义它。 这是PHP function

【讨论】:

    【解决方案2】:

    您应该始终使用任何特定于语言的方法来转义输入数据。对于 MySQL,转义字符是 \。另一种选择是使用带有参数化输入的准备好的语句。这将消除转义单个撇号的需要。

    我的猜测是,您的处理方式也存在严重的 SQL 注入漏洞。如果您甚至没有转义输入值或使用参数化的预处理语句,那么很容易将恶意代码注入 XML。

    【讨论】:

    • 如果我使用准备好的语句,我不需要修改我的 xml 来替换 's 对吗?
    • @Naveen 如果您使用参数化输入,那是正确的。如果您只是使用查询中包含的输入执行普通 SQL 查询并尝试准备/执行它,它仍然会失败。
    • 我尝试了准备好的语句,但它抛出了同样的错误。它是否取决于数据库中的数据类型?我正在使用长文本。
    • 对不起!我正在测试一个错误的文件。它的工作。非常感谢
    • @Naveen 抱歉昨天错过了您的后续评论。只要您实际使用参数化准备好的语句,就不需要转义撇号
    【解决方案3】:

    我不知道您使用什么语言或方法进行导入。通常它是反斜杠字符 \ 。所以你需要用\'替换's。有意义吗?

    【讨论】:

    • 在不改变我的 XML 的情况下,我如何在 Java 中单独实现这一点?
    • 使用准备好的语句:)
    【解决方案4】:

    来自 MySQL 参考中的9.1.1 String Literals

    有几种方法可以在字符串中包含引号字符:

    用“'”引用的字符串中的“'”可以写成“''”。

    用“"”引用的字符串中的“"”可以写成“""”。

    在引号字符前加上转义字符(“\”)。

    用“”引用的字符串中的“'”不需要特殊处理,也不需要加倍或转义。同样,用“'”引用的字符串中的“”不需要特殊处理。

    因此,给定的字符串foo'bar可以写在MySQL1

    'foo''bar'
    'foo\'bar'
    "foo'bar"
    

    虽然上述解决了主要问题,use placeholders (aka prepared statements) - 查找每种语言/适配器的正确方法。占位符消除了引用的需要(这可以防止自定义逻辑引入的错误)​​防止许多恶意 SQL 注入的情况。


    1 MySQL选择的语法不同于其他常见的SQL实现;这种语法不是通用的。

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 2018-06-12
      • 2011-01-27
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多