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

发布于 2024-07-13 12:34:21 字数 83 浏览 3 评论 0原文

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

谢谢。

I just wanted to know how can we escape an SQL query (string) in Ruby to prevent SQL Injection. please note I am not using Rails framework.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

只为守护你 2024-07-20 12:34:21

如果可能,请使用 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”。 其他参数同样被正确引用并插入到查询中。

If possible, use the Ruby DBI module, and instead of trying to quote your strings, use parametrized prepared queries, like this:

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

Quoting will be handled properly for you, and injections will be a thing of the past.

Edit: Note that this example shows nil being passed as the first parameter to execute(). It corresponds to the first ? in the query, and is translated to "NULL" by the DBI module. The other parameters are similarly properly quoted and inserted into the query.

夜雨飘雪 2024-07-20 12:34:21

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

def quote_string(v)
  v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end

Write a wee function to quote strings. I think Rails just uses something like this:

def quote_string(v)
  v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end
苍暮颜 2024-07-20 12:34:21

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

You don't have to use rails, you could just require 'activerecord' and use it as you would in rails (define models and use those). What you're doing there is just re-inventing the wheel.

简单爱 2024-07-20 12:34:21

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

Don't try to sanitize your data. Use prepared statements. See also http://bobby-tables.com/ruby.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文