如何使用Rails #order方法避免SQL注入

时间:2015-01-29 00:48:32

标签: ruby-on-rails postgresql activerecord postgis code-injection

在使用#order时,我无法在线查找有关阻止SQL注入的任何资源。使用? - where子句的占位符没有问题,但它似乎不适用于order-clause。

以下是一个例子:

query = Foo.where("ST_DISTANCE(coords, ?) < ?", point, distance)
           # The line below works:
           .order("ST_DISTANCE(coords, ST_GeomFromText('#{point}'))")
           # This line doesn't work:
           .order("ST_DISTANCE(coords, ST_GeomFromText(?))", point)

为了清楚起见:不起作用的行返回PGError字面上记录ST_DISTANCE(coords, ST_GeomFromText(?))

这是一个已知问题吗?

2 个答案:

答案 0 :(得分:1)

您是否尝试在GET / POST参数中传递POINT(-71.064544 42.28787)之类的内容?我在这里看到了例子http://www.postgis.org/docs/ST_GeomFromText.html

我认为更好

order("ST_DISTANCE(coords, ST_GeomFromText('POINT(%f %f))" % [lat, lon])

%Kernel::sprintf

的简写

答案 1 :(得分:0)

QueryMethod order调用preprocess_order_args,预计会给出一个字段列表和可选方向。

一种选择是调用sanitize_sql,可以在ActiveRecord类方法中完成:

# Inside Foo class
def self.order_by_distance(point)
  order(sanitize_sql(["ST_DISTANCE(coords, ST_GeomFromText(?))", point]))
end