Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将双引号和其他字符插入MySQL数据库时,何时需要对其进行转义?_Mysql - Fatal编程技术网

在将双引号和其他字符插入MySQL数据库时,何时需要对其进行转义?

在将双引号和其他字符插入MySQL数据库时,何时需要对其进行转义?,mysql,Mysql,在MySQL中插入文本字段时,何时需要转义双引号和/或特殊字符 假设您有一个包含双引号和/或符号的描述或文章的文本字段,那么在将其写入数据库表之前是否需要对其进行转义?在将其存储到数据库之前,不需要对其进行转义,但是,如果您正在编写代码来处理用户输入,请确保您已经阅读并完全理解了或正在遭受伤害的风险。MySQL(非标准)允许您使用双引号作为字符串文本的分隔符: SELECT * FROM Accounts WHERE first_name = "Mel" 如果在SQL字符串文字中插入内容,并且

在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”或“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") );
更多信息,请参见我的演示。

  • 只有在将字符串添加到由双引号限定的字符串文字中时,才需要对双引号进行编码。但是,您不应该使用双引号字符串文字,因为它们是其他数据库不支持的奇怪的非标准MySQL语法

    相反,使用单引号字符串文字(例如
    name='Mel'
    ),这是ANSI标准SQL,在任何地方都可以使用。当然,您需要在值中转义单引号,而不是双引号

  • MySQL字符串文本中需要转义的另一个主要字符是
    \
    ,因为MySQL将其用作转义字符。这是一种更不规范的行为,相当令人讨厌

大多数webdev环境将为您提供一个SQL字符串文本转义函数,因此您不必担心需要转义哪些确切字符才能包含在查询中。例如,PHP中的mysql\u real\u escape\u string。然而,正如Bill提到的,最好在可用的地方使用参数化查询,这样就不必担心SQL转义。您的文本将作为原始字符串直接跳入数据库,而无需任何中间转义

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


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

感谢Bill和其他所有人的详细解释。非常感谢。