【问题标题】:How to avoid SQL Injection with Rails #order method如何使用 Rails #order 方法避免 SQL 注入
【发布时间】:2015-01-29 00:48:31
【问题描述】:

我无法在网上找到任何关于使用#order 时防止 SQL 注入的资源。将 ?-placeholders 用于 where 子句没有问题,但它似乎不适用于 order 子句。

这是一个例子:

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(?))

这是一个已知问题吗?

【问题讨论】:

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


    【解决方案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 的简写

    【讨论】:

    • 应该是[lon, lat](即X Y)
    【解决方案2】:

    QueryMethodorder 调用 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
    

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 2011-01-13
      • 2017-12-02
      • 2011-06-28
      • 2011-08-16
      • 2014-12-15
      • 1970-01-01
      • 2016-09-16
      相关资源
      最近更新 更多