在使用#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(?))
。
这是一个已知问题吗?
答案 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])
的简写
答案 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