В рельсах обновления моделей обычно происходят через массовое назначение .Например, форма отправляет тонну атрибутов в ваше действие обновления, ваши действия обновления вызывают:
Model.update_attributes(params[:model])
, и все значения в переданном хэше обновляются в модели.Проблема в том, что произойдет, если хакер добавит
params[:model][:users_attributes][:email] = 'hacker@example.com'`
и обновит адрес электронной почты ассоциированного пользователя модели?
В Asp.Net MVC кажется, что вы просто не допускаете этого в шаблоне формы, и значение никогда не попадет в ваши модели, но в рельсах это не так, как это делается (поправьте меня, еслиЯ неправильно понимаю Asp.Net MVC).В Rails все в модели (по умолчанию) может быть назначено по массе, поэтому ваш страх оправдан.
В приведенной мной ссылке вы можете увидеть «Например, для обычной учетной записи пользователя вытолько для того, чтобы логин и пароль могли редактироваться пользователем. Не должно быть возможности изменить атрибут статуса посредством массового назначения. "
class User < ActiveRecord::Base
attr_accessible :login, :password
end
Это означает, что любые другие свойства должны быть установлены вручную и объект должен быть сохранен, что предотвращает тот же тип захвата свойств, от которого защищаются шаблоны форм Asp.Net.В Rails все, что должно быть назначено по массе, должно быть в вашем attr_accessible
, и тогда ActiveRecord является привратником.Независимо от того, как написаны ваши формы или что хакер делает с их HTML, эти атрибуты могут быть явно обновлены только вашим кодом, а не скрытыми вещами Rails.