Якщо ви вже деякий час використовуєте 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