代码之家  ›  专栏  ›  技术社区  ›  Mark Kadlec

如何防止字段和值都是动态的activerecord where子句中的sql注入

  •  1
  • Mark Kadlec  · 技术社区  · 7 年前

    我正在为字段和值都是动态的用户创建一个动态搜索。我现在已经使用了下面的代码,但是我想防止可能的sql注入,并想知道如何做到这一点。

    search_clause = "#{search_criteria.field} LIKE '%#{search_criteria.value}%'"
    organizational_users.where(search_clause)
    

    即使使用动态字段,我也可以参数化search_子句吗?我该怎么做?

    问题的关键是解决领域的动态部分,重复问题建议并没有真正解决该部分。

    任何帮助/建议将不胜感激!

    1 回复  |  直到 7 年前
        1
  •  1
  •   matthewd    7 年前

    对于值转义,最好的方法是将sql注入限制为引用查询中可见的任何单个标识符(例如,表中的每一列)。看起来是这样的:

    organizational_users.where("#{connection.quote_column_name search_criteria.field} LIKE ?", "%#{search_criteria.value}%")
    

    除非您绝对确定需要将每个列都公开到此筛选,否则应首先应用allowlist:

    raise "nope" unless search_criteria.field.in? %w(first_name last_name)
    organizational_users.where("#{connection.quote_column_name search_criteria.field} LIKE ?", "%#{search_criteria.value}%")
    

    (以上假设这是在模型方法中发生的。因为它涉及到使用连接引用列名,所以它实际上应该是…但如果没有,你就需要使用 SomeModel.connection.quote_column_name 相反。)

    推荐文章