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注入自動受到保護。