Questa domanda non specifica che la risposta deve venire da ActiveRecord
né specificare per quale versione di Rails dovrebbe essere. Per questo motivo (e perché è una delle prime e poche) risposte su come disinfettare i parametri in Rails ...
Ecco una soluzione che funziona con Rails 4:
In ActiveRecord::Sanitization::ClassMethods
avete sanitize_sql_for_conditions e dei suoi due altri alias: sanitize_conditions e sanitize_sql. I tre fanno letteralmente la stessa identica cosa.
sanitize_sql_for_conditions
accetta un array, hash, o una stringa di condizioni SQL e disinfetta loro in un frammento SQL valido per una clausola WHERE.
Anche in ActiveRecord è necessario
sanitize_sql_for_assignment
che
accetta un array, hash, o una stringa di condizioni SQL e disinfetta le in un frammento SQL valida una clausola SET.
- metodi di cui sopra sono compresi nel ActiveRecord :: Base per impostazione predefinita e pertanto, sono inclusi in qualsiasi modello di ActiveRecord.
Inoltre, tuttavia, in ActionController avete ActionController::Parameters
che consente di
scegliere quali attributi dovrebbero essere inseriti nella whitelist per l'aggiornamento di massa e quindi prevenire accidentalmente esporre ciò che non dovrebbe essere esposto . Fornisce due metodi per questo scopo: richiedono e permesso.
params = ActionController::Parameters.new(user: { name: 'Bryan', age: 21 })
req = params.require(:user) # will throw exception if user not present
opt = params.permit(:name) # name parameter is optional, returns nil if not present
user = params.require(:user).permit(:name, :age) # user hash is required while `name` and `age` keys are optional
Il "Parametri magico" si chiama Parametri Strong (docs here) ed è possibile utilizzare che per disinfettare i parametri in un controllore prima di inviarlo a un modello.
- I metodi di cui sopra sono incluse per default in
ActionController::Base
e quindi sono inclusi in qualsiasi controller Rails.
Spero che questo aiuti chiunque, se non altro per imparare e demistificare Rails! :)
Puoi darci un po 'più di contesto? 'sanitize_sql' e gli amici sono spesso chiamati all'interno delle classi derivate da AR :: Base, senza bisogno di modificare la visibilità – pilcrow
Questo è un punto valido e valido. Mi limito ad usare i metodi privati o protetti di qualcuno. – dimus