Використання strong_params поза межами масового присвоєння

Якщо ви вже деякий час використовуєте Ruby on Rails, ви, ймовірно, відразу помітите проблему в наступному фрагменті коду:

class AnyController < ApplicationController  
 def create  
 AnyModel.create!(params)  
 end  
end

Так, ви праві — тут не використовуються strong parameters! Strong parameters (сильні параметри) — це функція безпеки, яку надає Rails, щоб обмежити параметри для масового присвоєння до тих пір, поки вони явно не будуть дозволені.

Ось як має виглядати вдосконалений код:

class AnyController < ApplicationController  
 def create  
 AnyModel.create!(create_params)  
 end
private def create_params  
 params.permit(:name, :age, associated_attributes: [:id, :name, :category])  
 end  
end

Однак я хотів би запропонувати більш широкий підхід: використання strong parameters не повинно обмежуватись лише масовим присвоєнням.

Розглянемо наступний фрагмент коду:

class AnyController < ApplicationController  
 def create  
 boolean_records = OtherModel.where(boolean: params[:boolean])
# продовжується...  
 end  
end

Тут ми могли б природно припустити, що params[:boolean] завжди міститиме одне значення, наприклад, true, false або, у найгіршому випадку, значення, яке можна перевести в істинне або хибне. Однак воно також може містити масив булевих значень, таких як [true, false], що призведе до непередбачуваних шляхів виконання.

Щоб переконатися, що значення булевого параметра є скалярним, ми можемо використати strong parameters так:

class AnyController < ApplicationController  
 def create  
 boolean_records = OtherModel.where(boolean: permitted_params[:boolean])
# продовжується...  
 end private def permitted_params  
 params.permit(:boolean)  
 end  
end

Основний висновок тут полягає в тому, що використання strong parameters — це простий, але потужний спосіб переконатися, що ми працюємо зі скалярними значеннями або вкладеними атрибутами. Якщо їх не використовувати, це може призвести до непередбачуваних результатів, які можуть порушити функціональність кінцевої точки, або, в рідкісних випадках, створити вразливості безпеки.
Якщо ви вже деякий час використовуєте Ruby on Rails, ви, ймовірно, одразу помітите проблему в наступному фрагменті коду:

class AnyController < ApplicationController  
 def create  
 AnyModel.create!(params)  
 end  
end

Так, ви праві — тут відсутнє використання strong parameters! Strong parameters (сильні параметри) — це функція безпеки, яку Rails надає для обмеження параметрів для масового присвоєння до того часу, поки вони не будуть явно дозволені.

Ось як має виглядати вдосконалений код:

class AnyController < ApplicationController  
 def create  
 AnyModel.create!(create_params)  
 end
private def create_params  
 params.permit(:name, :age, associated_attributes: [:id, :name, :category])  
 end  
end

Однак я хотів би запропонувати більш широкий підхід: використання strong parameters повинно виходити за межі масових присвоєнь.

Розглянемо наступний фрагмент коду:

class AnyController < ApplicationController  
 def create  
 boolean_records = OtherModel.where(boolean: params[:boolean])
# продовжується...  
 end  
end

Тут ми могли б природно припустити, що params[:boolean] завжди міститиме одне значення, таке як true, false, або, у найгіршому випадку, значення, яке можна оцінити як істинне чи хибне. Однак воно також може містити масив булевих значень, наприклад, [true, false], що призведе до непередбачуваних шляхів виконання.

Щоб переконатися, що булеве значення залишається скалярним, ми можемо використати strong parameters ось так:

class AnyController < ApplicationController  
 def create  
 boolean_records = OtherModel.where(boolean: permitted_params[:boolean])
# продовжується...  
 end private def permitted_params  
 params.permit(:boolean)  
 end  
end

Основний висновок тут полягає в тому, що використання strong parameters — це простий, але потужний спосіб переконатися, що ми працюємо зі скалярними значеннями або вкладеними атрибутами. Якщо їх не використовувати, це може призвести до непередбачуваних результатів, які можуть порушити функціональність кінцевої точки, або, в рідкісних випадках, створити вразливості безпеки.

Перекладено з: Using strong_params beyond mass assignments

Leave a Reply

Your email address will not be published. Required fields are marked *