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

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

最佳答案

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 注入(inject),则可能会发生这种情况。

但是如果你避开内容中的双引号,你就可以打败他们的恶作剧:
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

关于mysql - 将双引号和其他字符插入 MySQL 数据库时,何时需要转义它们?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3859707/

10-14 12:53