我正在用RoR 4和PostgreSQL构建一个API。我想通过控制器中的索引操作给我的用户提供一些搜索功能。
为此,我构建了以下函数。
query_params是其中一个控制器中params.permit的结果。
然后,此函数的输出被发送到活动记录where函数。

def searchable (query_params)
    query = ''
    query_params.each do |key, value|
      value = value.to_s # Ensure this is a string or you will have crashes below
      # Equals any of multiple values
      if value[/\A(mul-)/]
        value[0..3] = ''
        query += "#{key} IN (#{value}) AND "
      # Not a single value
      elsif value[/\A(<>)/]
        value[0..1] = ''
        query += "(#{key} <> #{value}) AND "
      # Bigger or smaller than a single value
      elsif value[/\A[><]/]
        operator = value[/\A[><]/]
        value[0] = ''
        query += "(#{key} #{operator} #{value}) AND "
      # Equals a single value
      else
        query += "#{key} = '#{value}' AND "

      end
    end
    query = query[0..-5] # removes the last AND
  end

我担心这个方法会让我的数据库向sql注入打开。我说得对吗?如果你有一个可能注射的例子,那就太好了。最后,我能做些什么来阻止注射吗?
谢谢!

最佳答案

您应该使用默认的ActiveRecord查询函数,因为它们可以保护您免受大多数程序员的错误。此外,在将用户的输入传递给数据库查询之前,应该始终验证用户的输入。
关于RoR及其模型的要点是将您从DB中抽象出来,使您的应用程序(几乎)与DB无关。
顺便说一下,这个网站可能会有帮助:http://rails-sqli.org/
编辑:另一件事:永远不要将字符串直接传递给模型的查询。相反,只要传递一个散列。例子:
不要使用:

Model.where("id = #{params[id]}")

而是使用:
Model.where(id: params[id])

关于ruby-on-rails - 避免潜在的SQL注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31607675/

10-12 12:33