2012-03-13 9 views
12

A Userhas_oneAccount. Al configurar attr_accessible en el modelo de Usuario, ¿es mejor proteger :account, :account_id o ambos?Rieles attr_accessible: object vs: object_id

attr_accessible :account 

o

attr_accessible :account_id 

o

attr_accessible :account, :account_id 

Siento que ambos es el camino a seguir (ya que es más seguro) a pesar de que se siente menos seco.

actualización para dar más antecedentes

Sólo para dar un poco más antecedentes sobre eso que estoy pidiendo. Yo, como la mayoría de las personas, vi lo que le sucedió a Github, así que revisamos nuestra aplicación y la bloqueamos un poco más.

En el proceso de hacer esto yo encontramos pruebas en las que pasan en cuenta

User.create account: account

y donde pasamos en account_id:

User.create account_id: account.id

Mis opciones eran o bien el cambio todos ellos para ser constante o cambiar attr_accessible para permitir cualquiera. Decidí cambiarlos todos para ser consistente. Pero esto me preocupó de que tal vez estuviéramos utilizando ambos métodos en nuestra aplicación y podría romper nuestra aplicación solo permitiendo una u otra.

Me equivoqué cuando dije que usar ambos es más seguro. Fue un largo día.

+0

¿Está usando 'accept_nested_attributes_for' también? – tadman

+0

Si la respuesta a mi pregunta depende de la respuesta a la suya, me gustaría ver el motivo y una respuesta en ambos casos. – pcg79

+0

Si está usando 'accept_nested_attributes_for: account', entonces los rieles automáticamente intentarán aplicar y' params [: user] [: account_attributes] 'cuando lo haga su creación o actualización. En este caso, también necesitaría agregar 'attar_accessible: account_attributes' – rwc9u

Respuesta

7

No hay una respuesta correcta para esta, aunque depende de cómo pretenda actualizar a este usuario. attr_accessible :account le permitirá masa asigna la cuenta directamente como esto:

user.update_attributes(:account => account) 

útil si ya tiene un objeto de cuenta que desea asociar al usuario junto con una gran cantidad de otros atributos. Por otro lado, attr_accessible :account_id sería más apropiado si se asigna el ID de la cuenta, a partir de una lista desplegable o algún otro elemento de formulario:

user.update_attributes(params[:user]) # params[:user][:account_id] is a part of this hash 

Este último caso se considera generalmente más peligroso y era parte del problema Último problema de seguridad de Github: que puede publicar cualquier account_id que desee, incluida una cuenta que no le pertenece, y se le asignará a su usuario.

Así que, en general, iría por la primera y verificará para asegurar que la cuenta sea la que esperas, pero como dije al principio, puedes ir en cualquier dirección dependiendo de cómo quieras usarlo

0

¿No prefiere establecer attr_accessible :user o attr_accessible :user_id en su cuenta.rb, suponiendo que una cuenta belongs_to :user.

Además, attr_accessible es una lista blanca explícita.No veo cómo attr_accessible :user, :user_id sería más seguro que attr_accessible :user.

+0

Honestamente los detalles, si lo que entra dentro de ese modelo, es irrelevante. Es más una cuestión general de cuál es mejor. Y sí, probablemente me equivoqué cuando dije que usar ambos es más seguro. Añadiré más detalles en mi pregunta original. – pcg79

Cuestiones relacionadas