如何在Ruby中转义字符串以防止SQL注入?(无轨道)

如何在Ruby中转义字符串以防止SQL注入?(无轨道),ruby,sql-injection,Ruby,Sql Injection,我只是想知道如何在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(?, ?, ?)")

我只是想知道如何在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
def quote_string(v)
  v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end
报价将为您妥善处理,注射将成为过去


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

您不必使用rails,只需
要求“activerecord”
并像在rails中一样使用它(定义模型并使用它们)。你正在做的只是重新发明轮子。

编写一个wee函数来引用字符串。我认为Rails只是使用了如下内容:

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
def quote_string(v)
  v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end

不要试图清理数据。使用事先准备好的陈述。另请参见

为什么还要插入id字段?在普通设计中,这将自动递增。这只是一个例子。但是请注意,execute()的第一个参数只是nil,查询中对应的参数(第一个问号)是id。在本例中,“id”被插入为NULL。我想知道与OP相同的事情,但我只想将SQL语句写入一个文件,所以我猜准备好的语句不在表中了?我可以使用。检查转义字符串吗?参见greyfade的答案。或者安迪·莱斯特的。这只是一个坏主意。有时您正在使用一次性迁移脚本,并且没有安装额外的gems(没有rails或dbi),当这种情况发生时,这是一个有效的解决方案。在几乎任何其他情况下,你都应该使用事先准备好的陈述。