Больше информации об обновлении ActiveRecord, избегая 'attr_accessible' - PullRequest
0 голосов
/ 07 февраля 2011

Я использую Ruby on Rails 3, и я хотел бы знать некоторые варианты поведения этого кода:

@user.send :attributes=, @attrib, false

То есть от здесь .

Если у меня есть форма, которая возвращает эти параметры моему контроллеру:

params[:name]
params[:surname]
params[:email]

и в контроллере, который я использую

@user.send( # Avoiding 'attr_accessible'
  :attributes=, {
  :name => params[:name],
  :surname => params[:surname] },
  false )

@user.save

, он должен сохранять только «имя» и «атрибуты фамилии для @user ActiveRecord.Я попробовал это, и это работает, как ожидалось.Но ...

1. возможно, что злонамеренный пользователь может каким-либо образом установить значение электронной почты в процессе сохранения (также, если атрибут электронной почты не учитывается в операторе "send")?

2. Правильно ли следующее утверждение?

Вызов атрибутов = со значением false пока ничего не обновляет, он просто устанавливаетзначения атрибута, игнорируя при этом любой белый список attr_accessible.

Таким образом, вы можете просто впоследствии вызвать функцию сохранения, которая возвращает искомое логическое значение.

1 Ответ

2 голосов
/ 07 февраля 2011

Ваш код определенно не позволит злоумышленнику установить электронную почту.Я бы порекомендовал использовать следующий код, поскольку он выполняет то же самое и его легче читать:

@user.name = params[:name]
@user.surname = params[:surname]
@user.save

Кроме того, передача true в качестве второго параметра для атрибутов = позволяет защитить ваши атрибуты с помощью attr_protected иattr_accessible.Вы можете просмотреть документацию здесь .Это означает, что ваше утверждение верно: передача false в качестве второго атрибута игнорирует ваши атрибуты, защищенные массовым назначением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...