Rails attr_accessible: object vs: object_id
A User
has_one
Account
. При настройке attr_accessible
в модели пользователя лучше защитить :account
, :account_id
или оба?
attr_accessible :account
или
attr_accessible :account_id
или
attr_accessible :account, :account_id
Я чувствую, что оба - это путь (насколько это безопаснее), хотя он чувствует себя менее сухим.
Обновить, чтобы получить больше фона
Просто чтобы дать немного больше информации о том, почему я спрашиваю. Я, как и большинство ppl, видел, что случилось с Github, поэтому мы проходим через наше приложение и немного запираем его.
В процессе этого я нашел тесты, в которых мы передаем счет
User.create account: account
и где мы перешли в account_id:
User.create account_id: account.id
Мои параметры заключались в том, чтобы либо изменить их все на константу, либо изменить attr_accessible
, чтобы разрешить это. Я решил изменить их все, чтобы быть последовательным. Но меня беспокоило, что мы, возможно, использовали оба метода в нашем приложении, и я мог бы разорвать наше приложение, разрешив только одно или другое.
Я пропустил, когда сказал, что использование обоих более безопасно. Это был долгий день.
Ответы
Ответ 1
Нет правильного ответа для этого, хотя это зависит от того, как вы собираетесь обновлять этого пользователя. attr_accessible :account
позволит вам массово назначить учетную запись следующим образом:
user.update_attributes(:account => account)
Полезно, если у вас уже есть объект учетной записи, который вы хотите связать с пользователем, а также множество других атрибутов. С другой стороны, attr_accessible :account_id
было бы более подходящим, если бы вы назначали идентификатор учетной записи, как из выпадающего меню или какого-либо другого элемента формы:
user.update_attributes(params[:user]) # params[:user][:account_id] is a part of this hash
Этот последний случай, как правило, считается более опасным и был частью проблемы с недавней проблемой безопасности Github: вы можете публиковать любую учетную запись, которая вам нравится, включая учетную запись, которая не принадлежит вам, и ваш пользователь будет назначен он.
В общем, я бы пошел на первое и посмотрел, чтобы убедиться, что учетная запись такая, которую вы ожидаете, но, как я сказал в начале, вы можете пойти в любом случае на этом, в зависимости от того, как вы собираетесь использовать он.
Ответ 2
Не хотите ли вы установить attr_accessible :user
или attr_accessible :user_id
в свой аккаунт .rb, считая, что учетная запись belongs_to :user
.
Кроме того, attr_accessible
- это явный белый список. Я не вижу, как attr_accessible :user, :user_id
будет более безопасным, чем attr_accessible :user
.