Strong Parameters
安全なパラメーター処理です。
「Strong Parameters」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。
マスアサインメントの問題
フォームは一度に多くのフィールドを送信します。すべてをそのままモデルに渡すと、攻撃者が意図していなかったフィールドを追加し、admin: true のような値を設定できてしまいます。これがマスアサインメントの脆弱性です。
- ユーザー入力は決して信頼してはいけません。
- 許可するフィールドを明示的に指定する必要があります。
- RailsではStrong Parametersによってこれを強制します。
ストロングパラメータとは
ストロングパラメータを使うと、モデルが受け付けるパラメータを明示的に宣言する必要があります。許可されていないパラメータをマスアサインしようとすると、Railsはエラーを送出します。
これにより、気付かないまま存在するセキュリティホールを、明示的に許可してレビューできるフィールド一覧に置き換えられます。
requireとpermit
このパターンでは、2つのメソッドを使います。
require(:model)は、トップレベルのキーが存在することを保証します。permit(:field, ...)は、内側のフィールドを許可リストに登録します。
def article_params
params.require(:article).permit(:title, :body)
endヘルパーの利用
privateな model_params メソッドを定義し、作成や更新を行う箇所で呼び出します。生の params をモデルに渡してはいけません。
def create
@article = Article.new(article_params)
@article.save
redirect_to @article
end
private
def article_params
params.require(:article).permit(:title, :body)
endprivateメソッドにする理由
許可リストを1つのprivateメソッドにまとめると、次の利点があります。
createとupdateで同じルールを共有できます。- 許可されているフィールドを簡単に見つけてレビューできます。
- コントローラのアクションとして公開されません(privateメソッドにはルートを設定できません)。
フィルタリングされる値
送信されたキーのうち、permit のリストにないものは、モデルに渡る前にすべて破棄されます。フォームに何らかの理由で admin が含まれていても、title と body だけを許可していれば、admin の値は無視され、レコードは安全に保たれます。
配列の許可
チェックボックスのリストや複数選択など、配列を送信するフィールドは、値として空の配列を渡して許可します。これにより、そのキーに対して複数の値を受け付けられます。
params.require(:article).permit(:title, tag_ids: [])ネストしたハッシュの許可
ネストした属性(親と子を一度に編集するフォーム)では、内側のフィールドを記述したハッシュを使って、ネストしたキーを許可します。
params.require(:order).permit(
:customer_name,
items_attributes: [:product_id, :quantity]
)不足しているパラメータの処理
必須のキーがない場合、require は ParameterMissing を送出し、Railsは400 Bad Requestとしてレンダリングします。これにより、不正なリクエストからアクションを自動的に保護できます。
# Missing :article key raises:
# ActionController::ParameterMissingpermit!は危険
params.permit! を呼び出してすべてを許可することもできますが、これではマスアサインメントの脆弱性が再び開いてしまいます。信頼できる内部コンテキスト以外では避けてください。常に明示的なホワイトリストを優先してください。
ベストプラクティス
params を安全に保ちます:
- 必要最小限のフィールドだけをホワイトリストに登録します。
- 公開フォームから
roleやadminのような機密性の高いフラグを決して許可しないでください。 - このようなフィールドは、サーバー側のロジックに基づいてコントローラーで明示的に設定します。
理解度チェック
Strong Parameters についての理解度を確認します。
まとめ:Strong Parameters
入力を安全にフィルタリングする方法を学びました:
- マスアサインメントは現実的なセキュリティリスクです。
requireはトップレベルのキーを要求し、permitはフィールドをホワイトリストに登録します。- ホワイトリストは共有のプライベートメソッドにまとめます。
- 必要に応じて配列やネストしたハッシュを許可します。
permit!は避け、機密性の高いフラグを決して許可しないでください。
次は、ビューとレンダリングを使ってレスポンスを返します。
よくある質問
「Strong Parameters」レッスンは無料ですか?
はい。「Strong Parameters」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。
「Strong Parameters」で何を学びますか?
安全なパラメーター処理です。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Ruby Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Strong Parameters」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このRuby Academyレッスンでコードを書いて実行できますか?
はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ルートとリソース
- コントローラーとアクション
- Strong Parameters
- ビューとレンダリング