14

我只是想知道如何在 Ruby 中转义 SQL 查询(字符串)以防止 SQL 注入。请注意我没有使用 Rails 框架。

谢谢。

4

4 回答 4

17

如果可能,请使用 Ruby DBI 模块,而不是尝试引用您的字符串,而是使用参数化的准备查询,如下所示:

dbh = DBI.connect("DBI:Mysql:test:localhost", "testuser", "testpass")
sth = dbh.prepare("INSERT INTO people (id, name, height) VALUES(?, ?, ?)")
File.open("people.txt", "r") do |f|
  f.each_line do |line|
    name, height = line.chomp.split("\t")
    sth.execute(nil, name, height)
  end
end

报价将为您妥善处理,注射将成为过去。

编辑:请注意,此示例显示 nil 作为第一个参数传递给 execute()。它对应于第一个 ? 在查询中,并由 DBI 模块转换为“NULL”。其他参数同样被正确引用并插入到查询中。

于 2009-02-08T23:13:54.537 回答
4

编写一个小函数来引用字符串。我认为 Rails 只是使用这样的东西:

def quote_string(v)
  v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end
于 2010-03-08T14:54:29.773 回答
2

您不必使用导轨,您可以require 'activerecord'像在导轨中一样使用它(定义模型并使用它们)。你在那里所做的只是重新发明轮子。

于 2009-02-09T02:36:36.110 回答
0

不要试图清理您的数据。使用准备好的语句。另请参阅http://bobby-tables.com/ruby.html

于 2010-03-11T15:59:28.323 回答