我正在用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/