I parametri forti e attr_accessible
sono due modi diversi per aggiungere protezioni di sicurezza alla funzione "assegnazione di massa" Rails. Strong Parameters è il modo in cui è prescritto dalla versione corrente di Rails.
"Assegnazione di massa" è una comoda scorciatoia in Rails che consente di impostare molte proprietà di un modello in una singola istruzione.
Ad esempio, immagina di avere un @user
che desideri aggiornare con i dati dell'invio di un modulo. Senza assegnazione di massa, che avrebbe dovuto scrivere codice noioso come questo:
@user.first_name = params[:user][:first_name]
@user.last_name = params[:user][:last_name]
@user.phone_number = params[:user][:phone_number]
...
@user.save
E così via per ogni campo di modulo.
con assegnazione di massa, tutto questo codice diventa una sola riga:
@user.update(params[:user])
Ma, questo è pieno di buchi di sicurezza. Poiché params
contiene qualsiasi dato inviato dal browser, un utente malintenzionato potrebbe aggiungere dati a tale invio che non ci si aspettava. Ad esempio, potrebbero aggiungere is_admin=1
ai parametri. Se si dispone di una colonna del database is_admin
, l'assegnazione di massa consente all'utente di eseguire l'aggiornamento a un amministratore. Yikes!
Qui è dove entra in gioco Strong Parameters. Con Strong Parameters, Rails aumenterà un ActiveModel::ForbiddenAttributesError
se si tenta di fare l'ingenuo update(params[:user])
. Invece, è necessario essere espliciti sui parametri che ci si aspetta dall'invio del browser, utilizzando gli helper require
e permit
forniti da Strong Parameters. Come questo:
def user_params
# Note that :is_admin is not permitted!
params.require(:user).permit(:first_name, :last_name, :phone_number)
end
...
@user.update(user_params)
Non posso parlare per i manutentori di Rails, ma mi piace Parametri forte perché è flessibile. Se nel controller degli utenti sono presenti più azioni che prevedono parametri diversi, posso facilmente descrivere utilizzando permit
i parametri che dovrebbero essere consentiti.
Oppure, se ho diversi ruoli utente che sono autorizzati ad aggiornare diversi attributi, posso facilmente modellare tali permessi. Come menzionato @ CV-Gate, è possibile anche modificare queste autorizzazioni in fase di runtime, che è un potente.
In breve, la flessibilità di Strong Parameters è dovuta al fatto che è possibile definire il metodo user_params
ovunque e in qualsiasi modo. Hai tutta la potenza dei concetti di Ruby e OO per farlo funzionare nel modo desiderato.
Che dire di attr_accessible
?
Senza entrare troppo nel dettaglio (in quanto questa funzione non è più supportata da Rails): invece di utilizzare il metodo di permit
, si dovrebbe fare qualcosa di simile utilizzando un attr_accessible
macro nel modello stesso, in questo modo:
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :phone_number
...
end
Quindi, per casi semplici, funziona in modo molto simile a Strong Parameters; devi solo definire l'elenco degli attributi in un posto diverso.
Tuttavia, dal momento che attr_accessible
è fortemente associato alla definizione della classe del modello, si perde molta flessibilità.Cosa succede se si hanno due diverse azioni del controllore che devono eseguire l'assegnazione di massa per lo stesso modello User
? Ora sei bloccato.
attr_accessor
Il attr_accessor
macro è integrato in Ruby e non ha nulla a che fare con Rails, l'assegnazione di massa, o la sicurezza. Capita semplicemente di avere un nome simile. :)