update_attributes可以防止sql注入吗?ruby on rails does update_attributes防止sql注入?
例子:
if @user.update_attributes(params[:user])
# updated
end
我知道找到()和{}并在找到[]做:条件,但没有看到这种方法的任何信息。
update_attributes可以防止sql注入吗?ruby on rails does update_attributes防止sql注入?
例子:
if @user.update_attributes(params[:user])
# updated
end
我知道找到()和{}并在找到[]做:条件,但没有看到这种方法的任何信息。
是的,它的确如此。在内部,它只是遍历所有属性,设置它们的值然后调用保存!
def update_attributes(attributes)
with_transaction_returning_status do
self.attributes = attributes
save
end
end
def attributes=(new_attributes, guard_protected_attributes = true)
...
attributes.each do |k, v|
if k.include?("(")
multi_parameter_attributes << [ k, v ]
elsif respond_to?("#{k}=")
send("#{k}=", v)
else
raise(UnknownAttributeError, "unknown attribute: #{k}")
end
end
end
换句话说,它的作用是
m.update_attributes(:attr1 => "foo", :attr2 => "bar")
m.attr1 = "foo"
m.attr2 = "bar"
m.save
Rails3中与数据库交互的所有activerecord方法对于sql注入都是安全的。
唯一的例外是,如果你使用原始SQL的选项之一,例如:
Comment.find(:all, :conditions => "user_id = #{params[:user]}")
首选的形式是:
Comment.find(:all, :conditions => {:user_id => params[:user})
这将防止SQL注入自动受到保护。