我只是想知道如何在 Ruby 中转义 SQL 查询(字符串)以防止 SQL 注入。请注意我没有使用 Rails 框架。
谢谢。
如果可能,请使用 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”。其他参数同样被正确引用并插入到查询中。
编写一个小函数来引用字符串。我认为 Rails 只是使用这样的东西:
def quote_string(v)
v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end
您不必使用导轨,您可以require 'activerecord'
像在导轨中一样使用它(定义模型并使用它们)。你在那里所做的只是重新发明轮子。
不要试图清理您的数据。使用准备好的语句。另请参阅http://bobby-tables.com/ruby.html