转义 ' 在 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"
我尝试过的每个gsub
和tr
都会给我提供"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 强调 if 和 must,但是是的,那个!以上是关于转义 ' 在 Ruby 字符串中,不转义 \ 以插入 MySQL的主要内容,如果未能解决你的问题,请参考以下文章