转义 ' 在 Ruby 字符串中,不转义 \ 以插入 MySQL

Posted

技术标签:

【中文标题】转义 \' 在 Ruby 字符串中,不转义 \\ 以插入 MySQL【英文标题】:Escaping ' in Ruby string, without escaping \ for inserting to MySQL转义 ' 在 Ruby 字符串中,不转义 \ 以插入 MySQL 【发布时间】:2018-05-23 20:42:47 【问题描述】:

我有一个 Ruby 格式的字符串:"Henry's string"

我尝试过的每个gsubtr 都会给我提供"Henry\\'s string""Henry\\\\'s string" 等形式。

这些都转义了反斜杠,但给我留下了一个未转义的单引号。

我试过了:

"Henry's string".gsub("'","\\\\'") 具有不同数量的 \

"Henry's string".gsub(/'/) |x| "\\\\#x" 再次使用不同数量的 \

"Henry's string".gsub(/'/) |x| "\\#x".gsub(/\\/) |x| "#x"

我想我需要奇数个 \ 才能完全转义 '(以便加载到 mysql),但我不知道如何得到它。

【问题讨论】:

你希望你的输出字符串是什么? 【参考方案1】:

在向 MySQL 等数据库插入数据时,务必使用带有占位符值的预准备语句。我把它用粗体表示,因为理解它非常重要。只需要一点点失误,您就创建了一个SQL injection hole,任何人都可以利用,这些都可能造成极大的破坏。

转义字符串可能看起来很简单,但事实并非如此。您需要掩盖很多古怪的边缘情况,其中的细节过于复杂,无法在简短的回答中提及。

简单的解决方案是根本不用转义,而是编写这种形式的查询:

INSERT INTO table_name (column_name) VALUES (?)

? 代表您要插入的数据。例如,您可以将它们与 mysql2 driver 一起使用,如下所示:

stmt = @client.prepare("INSERT INTO table_name (column_name) VALUES (?)")
stmt.execute("Henry's string")

该驱动程序将负责正确编码值的位置,因此您不必担心。

您还可以使用Sequel 或ActiveRecord 之类的东西,进一步简化事情。

【讨论】:

但是如果你必须使用字符串操作,至少使用@client.escape,而不是尝试手动使用String#gsub,这样你就可以搞定了。 @muistooshort 强调 ifmust,但是是的,那个!

以上是关于转义 ' 在 Ruby 字符串中,不转义 \ 以插入 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

Ruby gsub 不会转义单引号

Ruby:将转义字符串写入YAML

将 Ruby 哈希转换为 JSON(不带转义字符)

通过 Ruby Telnet 发送转义序列

如何对字符串进行 HTML 编码/转义?有内置的吗?

Ruby