【问题标题】:How to replace single quote to backslash in ruby?如何在ruby中将单引号替换为反斜杠?
【发布时间】:2015-11-05 05:32:00
【问题描述】:

为了防止sql注入,我这样做了:

string = "105;' DROP TABLE Suppliers"
new_string = string.gsub("'", %q(\'))
p new_string
=> "105; DROP TABLE Suppliers DROP TABLE Suppliers"

这里为什么输出DROP TABLE Suppliers两次?

【问题讨论】:

  • 这个和Replace “&” to “\&” in Ruby seems impossible?基本一样吧?答案至少是一样的。
  • 为什么不使用准备好的语句支持的参数化查询?
  • @Gumbo 因为我的特殊项目,我不能使用任何参数化的方法。
  • @scho:您使用的是什么数据库/驱动程序?可能有一种方法可以在不使用参数的情况下调用其转义功能。
  • @mwp Google BigQuery

标签: ruby sql-injection


【解决方案1】:

Ruby 将 \' 解释为对匹配后字符串 ($') 的反向引用。因此,您将用引号后的所有内容替换引号:

<space>DROP TABLE Suppliers
     V
"105;' DROP TABLE Suppliers"

这里是对预匹配变量($`)的反向引用:

string = "105;' DROP TABLE Suppliers"
new_string = string.gsub("'", %q(\`))
p new_string

--output:--
"105;105; DROP TABLE Suppliers"

我找不到任何关于 ruby​​ 全局变量反向引用的文档,所以恭喜你成为 ruby​​ 先驱。

【讨论】:

  • 谢谢。我只想将用户可能输入的字符串中的' 替换为\'。不是吗?那你觉得怎么做呢?
  • 添加斜线?不是反斜杠?
  • @scho,返回斜线。
  • 是的。防止sql注入。我认为是安全的:105;\' DROP TABLE Suppliers.
  • @scho:不,您为什么认为 SQL 使用反斜杠来转义单引号?我认为双引号更常见。无论如何,这一切都错了,试图手动转义字符串以防止 SQL 注入是愚蠢的游戏。使用占位符或数据库驱动程序的引用方法。
【解决方案2】:

好消息是事实证明您不必这样做。有关更多深入信息,请阅读下面的 cmets。要转义单引号,请添加另一个单引号。所以获胜者是:

string.gsub(/'/, "''") 

【讨论】:

  • %q(\')"\\'" 是等价的。
  • 是的,这是真的。我不确定你的意思是什么,因为我的意思是块替换仍在工作,但我想你可能只是意味着可以做 string.gsub(/'/){ %q(\') }
  • 不。我错过了您代码中的代码块。通常在一个块中,您只需使用全局变量 $` 和 $' 来指代赛前和赛后,并使用 $1、$2 等来表示括号中的组。但是,gsub() 文档确实对块形式有不同的描述,并且块形式中没有提到反向引用——实际上我的测试表明反向引用在块形式中不起作用。在我看来,该操作发布的内容不可能是错误。正则表达式引擎必须在字符串中查找 \1、\2 等,显然有人编写了代码来另外查找反向引用 \'
  • 有趣。很惊讶我以前从未见过这个。从来不知道反向引用\'。每天学习新东西:),谢谢。我想我已经习惯了 Rails 处理字符串的处理,所以我从未见过这种情况。尽管我们在很多年前的 JAVA 时代经常这样做,但我想感谢 Rails,我已经很久没有做 sql sanitation 了。说到,我查看了 sanitize_sql_array 是如何做到的,它导致以下行: s.gsub(/\\/, '\&\&').gsub(/'/, "''") 用于转义转义任何 '(单引号)和 \(反斜杠)。所以\'毕竟是不需要的:)
  • 每天学习新的东西。是的。我找不到任何文档提到您可以反向引用全局匹配变量。但是,如果 $1 是第一个带括号的组的全局匹配变量,并且您可以使用 \1 反向引用它,那么您也可以使用 \' 反向引用匹配后变量 $'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2017-03-29
  • 2022-01-27
相关资源
最近更新 更多