【问题标题】: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),但我不知道如何得到它。

【问题讨论】:

  • 你希望你的输出字符串是什么?

标签: mysql ruby escaping gsub single-quotes


【解决方案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")

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

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

【讨论】:

  • 但是如果你必须使用字符串操作,至少使用@client.escape,而不是尝试手动使用String#gsub,这样你就可以搞定了。
  • @muistooshort 强调 ifmust,但是是的,那个!
猜你喜欢
  • 2012-03-25
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多