カテゴリ: Rails 更新日: 2025/12/01

RailsのStrong Parametersでやってはいけない書き方!初心者でもわかるpermit!の危険と安全な書き方

Strong Parametersアンチパターン:permit!の危険と安全な代替
Strong Parametersアンチパターン:permit!の危険と安全な代替

先生と生徒の会話形式で理解しよう

生徒

「Railsでフォームの値を受け取るときに、Strong Parametersって使うみたいですが、permit!って書いたら全部許可できるって聞きました。」

先生

「確かにpermit!はすべてのパラメータを許可する強力な方法ですが、とても危険な使い方なんですよ。」

生徒

「危険なんですか?書き方が楽だから便利だと思ったのに……」

先生

「便利そうに見えて、セキュリティ上の大きなリスクがあるんです。今日はその理由と、安全な書き方を丁寧に解説していきましょう。」

1. Strong Parametersとは?

1. Strong Parametersとは?
1. Strong Parametersとは?

Strong Parameters(ストロングパラメータ)とは、Railsのコントローラで受け取る値を明示的に指定する仕組みです。

これにより、想定外の値が勝手に保存されるのを防ぐことができ、セキュリティを強化できます。

例えば、ブログ記事を保存する場合、次のようにparamsから許可するキーを指定します。


def post_params
  params.require(:post).permit(:title, :body)
end

:title:bodyだけを受け取るようにし、それ以外の項目はすべて無視されます。

2. permit!とは?なぜ使ってはいけない?

2. permit!とは?なぜ使ってはいけない?
2. permit!とは?なぜ使ってはいけない?

permit!は、すべてのパラメータを無条件で許可するメソッドです。

次のように書くと、送られてきた全データを一気に許可してしまいます。


def post_params
  params.require(:post).permit!
end

これは非常に危険なコードです。たとえば、悪意のあるユーザーが管理者フラグ(admin)や、他人のuser_idを勝手に含めて送ってきたとしても、それらがそのまま保存されてしまいます。

3. permit!の危険性を具体例で確認

3. permit!の危険性を具体例で確認
3. permit!の危険性を具体例で確認

たとえば、次のようなユーザー更新フォームがあるとします。


<form action="/users/1" method="post">
  <input name="user[name]" value="山田太郎" />
  <input name="user[admin]" value="true" />
</form>

そして、コントローラ側でpermit!を使っていた場合、


def user_params
  params.require(:user).permit!
end

悪意のあるユーザーが管理者になれてしまうという、大変な問題が起きます。

4. 安全なStrong Parametersの書き方

4. 安全なStrong Parametersの書き方
4. 安全なStrong Parametersの書き方

permit明示的に受け取る項目を一つひとつ指定するのが基本です。


def user_params
  params.require(:user).permit(:name, :email)
end

このようにしておけば、:name:emailしか保存されないので、予期せぬ項目が登録される心配はありません

5. ネストされたデータを扱う場合もpermitを使おう

5. ネストされたデータを扱う場合もpermitを使おう
5. ネストされたデータを扱う場合もpermitを使おう

たとえば、投稿と一緒にタグの情報を送るといった、ネストされたパラメータも、安全に扱うことができます。


def post_params
  params.require(:post).permit(:title, :body, tags: [])
end

tags: []のように配列として許可することで、指定されたデータだけが保存されるようになります。

6. 管理者だけ許可したい項目はコントローラ側で分岐

6. 管理者だけ許可したい項目はコントローラ側で分岐
6. 管理者だけ許可したい項目はコントローラ側で分岐

「管理者だけが:adminを更新できるようにしたい」といった場合は、条件分岐で対処します。


def user_params
  if current_user.admin?
    params.require(:user).permit(:name, :email, :admin)
  else
    params.require(:user).permit(:name, :email)
  end
end

このようにすることで、一般ユーザーにはadmin項目が反映されないように防止できます。

7. Strong ParametersはRailsセキュリティの基本

7. Strong ParametersはRailsセキュリティの基本
7. Strong ParametersはRailsセキュリティの基本

Strong Parametersは、Railsで安全にデータを扱うための基本的なセキュリティ機構です。

面倒だからといってpermit!を使ってしまうと、アプリケーション全体が乗っ取られる危険性もあります。

初心者のうちから、明示的に項目を許可する癖をつけることで、安全なWebアプリを作る力が身につきます。

関連記事:
カテゴリの一覧へ
新着記事
New1
データベース
SQLの処理が遅くなる原因とは?初心者向けにデータベースパフォーマンス最適化を完全解説
New2
Ruby
RubyのネストHash操作を徹底解説!digとtransformメソッドで複雑なデータも楽々
New3
Rails
Railsインデックス設計の極意!爆速サイトを作るためのスキーマ設計ガイド
New4
データベース
SQLのCOMMITとROLLBACKとは?トランザクション操作を初心者向けに完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
PATHと環境変数の正しい設定!Windows・Mac・Linux別チェックリスト付き
No.2
Java&Spring記事人気No2
Rails
Railsで日本語と時刻の設定をしよう!初心者でも安心のlocale/zone初期設定チートシート
No.3
Java&Spring記事人気No3
Ruby
Rubyのハッシュを徹底比較!シンボルキーと文字列キーの違いと使い分け
No.4
Java&Spring記事人気No4
Rails
Railsマイグレーションの型選びを完全ガイド!初心者が迷わないカラム設計
No.5
Java&Spring記事人気No5
Ruby
WindowsでRubyをインストールする方法!RubyInstallerとMSYS2を使った完全ガイド
No.6
Java&Spring記事人気No6
Rails
RailsモデルとActive Record基礎|ID戦略を完全理解!AUTO INCREMENT・UUID・ULIDの比較と導入手順
No.7
Java&Spring記事人気No7
データベース
ACID特性とは?データベーストランザクションの信頼性を初心者向けに徹底解説
No.8
Java&Spring記事人気No8
Rails
RailsモデルとActive Record基礎|クエリログの読み方を理解してEXPLAIN・joins・includesの違いを学ぼう