【问题标题】:When is it necessary to escape double quotes and other characters when inserting them into MySQL database?将双引号和其他字符插入 MySQL 数据库时,何时需要转义?
【发布时间】:2010-10-04 22:44:24
【问题描述】:

在 MySQL 中插入文本字段时,何时需要转义双引号和/或特殊字符?

假设您有一个包含双引号和/或与号的描述或文章的文本字段,是否有必要在将它们写入数据库表之前对其进行转义?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    MySQL(非标准)允许您使用双引号作为字符串文字的分隔符:

    SELECT * FROM Accounts WHERE first_name = "Mel"
    

    如果您将内容插入到 SQL 字符串文字中,并且您的内容包含双引号,则会遇到麻烦:

    SELECT * FROM Articles WHERE description = "She said, "Murder"!"
    

    这可能是一个简单的意外,这可能只是导致语法错误。但攻击者也可以巧妙地利用这一点,让您的查询做一些您不打算做的事情。

    UPDATE Accounts SET PASSWORD = "..." WHERE account_name = "Mel" OR "X"="X"
    

    如果攻击者声称他们的帐户名为Mel" OR "X"="X,这可能会发生这种情况,这称为 SQL 注入。

    但如果你避开内容中的双引号,你就可以打败他们的恶作剧:

    UPDATE Accounts SET PASSWORD = "..." WHERE account_name = "Mel\" OR \"X\"=\"X"
    

    但是,使用查询参数更简单,因此您可以确保内容与 SQL 代码分开,并且永远不会导致意外的表达式:

    UPDATE Accounts SET PASSWORD = ? WHERE account_name = ?
    

    参数允许您使用占位符准备查询,然后在执行时为每个占位符提供动态内容。例如在带有 PDO 的 PHP 中:

    $sql = "UPDATE Accounts SET PASSWORD = ? WHERE account_name = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute( array("...", "Mel") );
    

    有关更多信息,请参阅我的演示文稿SQL Injection Myths and Fallacies

    【讨论】:

    • 感谢比尔和其他所有人的详尽解释。非常感谢。
    【解决方案2】:

    您无需在将它们存储到数据库之前对其进行转义,但如果您正在编写代码来处理用户输入确保您阅读并完全了解SQL Injection vulnerabilities 的风险或你正处于一个受伤的世界。

    【讨论】:

      【解决方案3】:
      • 仅当您将字符串添加到由双引号包围的字符串文字中时,才需要对双引号进行编码。但是,您不应该使用双引号字符串文字,因为它们是其他数据库不支持的奇怪的非标准 MySQL 语法。

        改为使用单引号字符串文字(例如name='Mel'),它们是ANSI 标准SQL 并且可以在任何地方使用。然后当然你需要在值中转义单引号,而不是双引号。

      • 在 MySQL 字符串文字中需要转义的另一个主要字符是 \,因为 MySQL 使用它作为转义字符。这是更不标准的行为,非常烦人。

      大多数 webdev 环境都会为您提供 SQL 字符串文字转义功能,因此您不必担心哪些确切的字符需要转义才能包含在查询中。例如,mysql_real_escape_string 在 PHP 中。但是,正如比尔提到的,您最好在可用的情况下使用参数化查询,因此您根本不必担心 SQL 转义。您的文本将作为原始字符串直接跳转到数据库中,无需任何中间转义-取消转义步骤。

      对于 & 符号,它们在 SQL 字符串文字中并不特殊,并且在从字符串创建查询时应该 进行转义。它们在 HTML 中很特殊,但您不希望在数据库中使用 HTML 编码的数据。相反,在将字符串插入 HTML 内容时使用 HTML 转义函数(如 PHP 中的 htmlspecialchars),而之前

      在表单提交或 SQL 构建阶段尝试在输入阶段对内容进行 HTML 转义或“清理”是一个常见错误。但这是一个 HTML 输出阶段的问题,只能在模板阶段解决。

      【讨论】:

        猜你喜欢
        • 2012-12-11
        • 2011-05-23
        • 2013-02-10
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 2011-06-13
        相关资源
        最近更新 更多