我在Mac上使用Rails 3.2.11
我有这句话可以正常工作:
object= Object.find_by_id(params[:id])
我正在尝试为该陈述添加一个条件,所以我这样做了:
object = Object.where("id = :id AND level <= :level",{:id => params[:id], :level => current_user.level})
这种方法会有风险吗?任何替代方案?
答案 0 :(得分:1)
如果ActiveRecord继续维持消毒输入合同,则此声明不存在风险。另一种选择是范围,但实际上只是用不同的语法做同样的事情。
您可以执行set a default scope定义level
限制,然后您可以执行标准find_by_id
。但如果这是不合需要的,只需正确使用语法:
Object.where(id: params[:id], level: current_user.level)
答案 1 :(得分:0)
没有风险,但定义方式不容易理解。
简单的陈述将起作用:
object = Object.where("id = ? AND level <= ?",{params[:id], current_user.level})
答案 2 :(得分:0)
只要你让rails处理你的值的消毒,你就没有问题。我的意思是使用像
这样的用户输入从rails运行sql命令Object.where("id = #{params[:id]} AND level <= #{current_user.level}")
将容易受到sql注入