Strong Parametersの書き方:require・permitで安全に受け取る【保存版】
生徒
「Railsでフォームから送信されたデータを安全に受け取る方法ってあるんですか?」
先生
「それにはStrong Parameters(ストロングパラメータ)という仕組みを使います。Railsがセキュリティのために用意している方法です。」
生徒
「どんな仕組みなんですか?パラメータって危ないんですか?」
先生
「パラメータは、入力欄から送られてくる値のことですが、意図しない値が混ざっていると困るので、受け取る内容をあらかじめ許可する必要があるんです。それでは詳しく解説しましょう!」
1. Strong Parametersとは?
Strong Parameters(ストロングパラメータ)は、Railsでフォームやリクエストから送られてくるデータを、安全に受け取るための仕組みです。
Railsでは、ユーザーが入力した値はすべてparamsとしてサーバーに届きますが、その中には本来アプリ側で想定していない項目が含まれている可能性もあります。
Strong Parametersは、そうした不要なデータをあらかじめブロックし、必要なものだけを明示的に許可する役割を持っています。
たとえば、画面には表示していない項目を、悪意のあるユーザーが勝手に送信してくるケースも考えられます。 Strong Parametersを使わずにそのまま保存してしまうと、意図しない情報がデータベースに登録されてしまう危険があります。 そこでRailsでは、「受け取ってよいキーはこれだけ」と事前に決める仕組みとしてStrong Parametersが用意されています。
初心者の方は少し難しく感じるかもしれませんが、考え方はとてもシンプルです。 「フォームから来たデータを、そのまま信じない」という意識を持ち、安全確認をしてから使うためのルールだと理解すると分かりやすくなります。
# Strong Parametersの超シンプルなイメージ
# フォームから送られてきた中で、使ってよいものだけを選ぶ
params.require(:post).permit(:title, :body)
このように、Strong ParametersはRailsアプリのセキュリティを守る基本中の基本です。 フォーム処理を書くときは、「まずStrong Parametersを書く」という習慣を身につけておくと、安心して開発を進められるようになります。
2. requireとpermitの役割
requireとpermitは、Strong Parametersを使ううえで必ずセットで登場する重要なメソッドです。 それぞれ役割がはっきり分かれており、「どのデータを受け取るか」を段階的にチェックするために使われます。 初心者の方は、requireは入口チェック、permitは中身チェックと考えるとイメージしやすくなります。
- require:「このキーが存在しないと処理できません」と指定する役割
- permit:「このキーの中で、使ってよい項目はこれだけです」と許可する役割
まずrequireで大きな箱(例:post)があるかを確認し、
次にpermitでその中身から必要な値だけを取り出します。
この順番を守ることで、不要なデータが混ざるのを防げます。
# requireとpermitの基本形(初心者向け)
params.require(:post).permit(:title, :body)
上の例では、「postというまとまりが必ず存在すること」を確認したうえで、
その中のtitleとbodyだけを安全に使えるようにしています。
この書き方を覚えておけば、多くのフォーム処理にそのまま応用できます。
3. サンプルコードで理解しよう
ここでは、Strong Parametersが実際のコントローラ処理の中でどのように使われるのかを、できるだけシンプルな例で確認してみましょう。 初心者の方は、「フォームから送られてきたデータを、新しいデータとして保存する流れ」をイメージしながら読むと理解しやすくなります。
たとえば、titleとbodyを入力して記事(Post)を作成する場合、コントローラでは次のような処理を書くのが一般的です。
createアクションの中では、Strong Parametersを直接書かず、専用のメソッドを呼び出して使います。
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post
else
render :new
end
end
private
def post_params
params.require(:post).permit(:title, :body)
end
このコードでは、Post.newにそのままparamsを渡していない点が重要です。
代わりにpost_paramsというメソッドを通して、許可したパラメータだけを使っています。
これにより、フォームに存在しない項目や、意図しない値が混ざっていても自動的に無視されます。
params.require(:post)は「postというまとまりが必ずあるか」を確認し、
permit(:title, :body)で「使ってよいのはこの2つだけ」と明示しています。
Strong Parametersの基本形として、この書き方は今後も何度も登場するので、ここでしっかり慣れておきましょう。
4. なぜStrong Parametersが必要なのか?
Strong Parametersが必要な理由はひとことで言うと、フォームから届くデータをそのまま信用すると危険だからです。 Railsでは、入力欄に書いた内容だけでなく、通信の中身を工夫すれば「画面にない項目」まで一緒に送れてしまいます。 つまり、開発者が想定していないデータが混ざる可能性がある、ということです。
Strong Parametersを使わないと、次のようなトラブルにつながることがあります。
- 意図しないデータが保存される(本来は触れない項目まで更新される)
- 権限に関わる値を改ざんされる(例:管理者フラグを勝手に変更される)
- 不正なリクエストに弱くなる(外部からの操作で想定外の更新が起きる)
たとえば、ユーザー情報を更新する画面で「名前」だけを変更できるつもりでも、
悪意のある人がadminのような項目をこっそり送ってくる可能性があります。
Strong Parametersで許可していない項目は弾かれるため、こうした事故を防げます。
# 例:ユーザー更新で「名前」だけ許可する(初心者向け)
# adminなどを送られても、permitしていないので無視される
def user_params
params.require(:user).permit(:name)
end
ポイントは、「受け取っていい項目は自分で決める」という姿勢です。 Strong Parametersを使うことで、Railsのフォーム送信や更新処理を安全に保ちやすくなり、 余計なバグやセキュリティ事故を減らせます。
5. ネストされたパラメータの扱い方
フォームで複数の情報を同時に送ると、ネスト(入れ子)されたパラメータになります。たとえば、複数のタグを配列で送るときは次のように書きます。
params.require(:post).permit(:title, :body, tags: [])
tags: []と書くことで、タグの配列も受け取れるようになります。
6. フォームから送られるパラメータを見てみよう
フォームから送信されたデータは、Railsではparamsというオブジェクトに入って届きます。たとえば、次のようなHTMLフォームがあるとします。
<form action="/posts" method="post">
<input type="text" name="post[title]">
<textarea name="post[body]"></textarea>
<input type="submit" value="保存">
</form>
このフォームが送信されると、サーバーには次のような形で届きます。
"post" => { "title" => "タイトル", "body" => "本文" }
このデータから、必要なものだけを抜き出して許可するのがStrong Parametersの目的です。
7. モデルの属性を全て許可するのはNG
たとえば次のようにpermit!を使うと、すべての値を許可してしまいます。
params.require(:post).permit!
これは開発中の仮実装では便利ですが、本番環境ではセキュリティ上とても危険です。どの属性を許可するかは、明示的に1つ1つ指定するのが原則です。
8. privateメソッドで分けて使おう
Strong Parametersはprivateメソッドとして切り出すのが一般的です。createやupdateアクションから呼び出して、コードを整理しやすくします。
private
def post_params
params.require(:post).permit(:title, :body)
end
このように書くことで、アクションの中身もスッキリして、再利用しやすくなります。
まとめ
Strong Parametersで学んだ大切な考え方
この記事では、RailsにおけるStrong Parametersの基本から実践的な使い方までを、順を追って確認してきました。 Strong Parametersは、フォームやリクエストから送られてくるデータを安全に扱うための仕組みであり、 RailsでWebアプリケーションを開発するうえで避けて通れない重要なポイントです。
まず大切なのは、「フォームから送られてきた値をそのまま信用しない」という考え方です。 paramsの中には、画面に表示していない項目や、開発者が想定していない値が含まれる可能性があります。 そこでrequireで必要なまとまりを確認し、permitで使ってよい項目だけを明示的に許可することで、 意図しないデータの保存や更新を防げるようになります。
また、配列やネストされたパラメータの扱い方、permit!を使う危険性、 Strong Parametersをprivateメソッドに切り出す理由なども確認しました。 どれも日々のRails開発で頻繁に登場する内容であり、 小さな積み重ねがセキュリティ事故やバグを防ぐことにつながります。
基本を押さえるためのサンプル例
Strong Parametersの基本形はとてもシンプルです。 フォームで入力されたデータを受け取り、必要なものだけを許可する、 この流れを毎回同じ形で書くことが大切です。
private
def post_params
params.require(:post).permit(:title, :body)
end
このようにprivateメソッドとして定義しておけば、 createやupdateアクションから何度でも使い回せます。 後から項目が増えた場合でも、このメソッドを修正するだけで対応できるため、 コードの見通しも良くなります。
Strong Parametersは一度覚えてしまえば難しいものではありません。 毎回同じ書き方を繰り返し、自然に手が動くようになることが理想です。 安全なRailsアプリケーションを作るための基本として、ぜひ身につけておきましょう。
生徒
「Strong Parametersって難しそうだと思っていましたが、 フォームから来たデータをそのまま使わない、という考え方が大事なんですね」
先生
「その通りです。requireで必要なまとまりを確認して、 permitで使っていい項目だけを選ぶ、これが基本になります」
生徒
「privateメソッドに切り出す理由も分かりました。 毎回同じ形で書いておくと、後から見返しても安心ですね」
先生
「そうですね。Strong Parametersはセキュリティの土台です。 地味に見えますが、ここを丁寧に書ける人ほど、安定したアプリを作れますよ」
生徒
「これからはフォームを作るときに、 まずStrong Parametersを書く習慣を意識してみます」
先生
「それが一番の近道です。 今日学んだ内容をベースに、実際のRails開発でどんどん使ってみましょう」