我在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})
这种方法会有风险吗?有其他选择吗?
如果ActiveRecord继续维护清除输入的合同,则此语句不会带来任何风险。另一种选择是作用域,但实际上只是用不同的语法做同样的事情。
您可以做的一件事是设置一个定义level
限制的默认范围,然后您可以只执行一个标准的find_by_id
。但如果这是不可取的,只需正确使用语法:
Object.where(id: params[:id], level: current_user.level)
没有风险,但其定义方式并不容易理解。
简单的语句会起作用:
object = Object.where("id = ? AND level <= ?",{params[:id], current_user.level})
只要让rails处理值的净化,就不会有任何问题。我的意思是使用用户输入(如)从rails运行sql命令
Object.where("id = #{params[:id]} AND level <= #{current_user.level}")
将容易受到sql注入的攻击