7

在 ruby​​ 中,ActiveRecord 不提供更新和插入 sql 的动态绑定,当然我可以使用原始 sql,但是需要保持连接,所以我想知道在执行下面的代码之前是否有更简单的方法来逃避更新或插入 sql :

ActiveRecord::Base.connection.insert(sql)

我想我可以通过 gsub 编写代码,但我知道是否有现成的方法可以做到这一点。

4

3 回答 3

16

在 Rails >= 3.2.5 中,以下对我有用:

evil_input = '"\';%#{}\"foo'
ActiveRecord::Base.connection.quote(evil_input)
=> "'\"'';%\#{}\\\"foo'"
于 2012-09-01T01:12:31.047 回答
10

你可以这样做:

ActiveRecord::Base.send(:sanitize_sql,["select * from my_table where description='%s' and id='%s'","mal'formed", 55], "my_table")

当然,这意味着您有单独的参数。不知道它是否会起作用,但试试看。

于 2010-12-24T11:51:15.477 回答
0

不清楚您要问什么,因为您的标题谈到在插入或更新之前转义字符串,然后在标签中谈到 SQL 注入。

如果您需要在插入或更新之前让 ActiveRecord 自动编码/修改内容,您是否检查过ActiveRecord 的回调?当before_save您进行更新或创建时,回调将触发。如果您想在存储内容之前对其进行修改,那么这是一个不错的选择。

如果您想使用 SQL 参数而不是将变量插入“更新”或“插入”语句以避免 SQL 注入,请使用 AR 的变量绑定。向下滚动到“条件”部分。

于 2010-12-24T10:59:25.120 回答