0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsセキュリティ入門:Strong Parametersで守るWebアプリ

はじめに

今回は私がRailsを学習していく中での学習内容のアウトプットとしてこの記事を書いています。またこの記事に関しての先輩方の意見や知見もいただけると幸いです。

Strong Parametersとは?

Strong ParametersはRailsの機能の一つで、フォームやAPIから送られてくるデータの中から「受け取って良い項目だけを明示的に指定する」ための仕組みです。

これにより、無関係な悪意のあるデータの受け入れや更新を防ぐことができます。

以前のRailsでは、許可しない属性まで勝手に更新されてしまう「Mass Assignment(大量代入)脆弱性」が問題となっていましたが、Strong Parameters導入によりこのリスクは大幅に軽減されました。


なぜStrong Parametersが必要なのか?

例えば、フォームに表示されていない管理者フラグやユーザーIDなどを、悪意のあるユーザーがリクエストに紛れ込ませて送信することで、権限を不正に昇格させたり、他ユーザーのデータを書き換えられる恐れがあります。

Strong Parametersを使うことで、**「本当に許可したいパラメータだけを受け入れ、その他はすべて無視する」**という安全なデータ制御が可能になるのです。


Strong Parametersで防げる代表的な攻撃例

  • Mass Assignment 脆弱性
    許可していないモデルの属性が外部から書き換えられてしまう攻撃。
    → Strong Parametersで更新可能な属性を限定することで防止可能。

  • 権限昇格攻撃(Privilege Escalation)
    管理者権限などをリクエストで勝手に設定し、不正操作を行う。
    → 意図しない属性を受け付けないことで防止。

  • ID偽装攻撃(Parameter Tampering)
    他ユーザーのIDなどを不正に指定して操作する。
    → 受け入れるパラメータを限定しつつ、さらにサーバー側での権限チェックも必要。


参考情報


実装例:Q&Aアプリの質問投稿フォームにおける Strong Parameters

最後に、私が現在開発しているQ&Aアプリにおける質問投稿時のストロングパラメータの実例を紹介します。

コントローラーの記述例

class QuestionsController < ApplicationController
  # 質問の作成フォーム表示
  def new
    @question = Question.new
  end

  # 質問の作成処理
  def create
    @question = Question.new(question_params)
    if @question.save
      redirect_to @question, notice: "質問を投稿しました。"
    else
      render :new, status: :unprocessable_entity
    end
  end

  private

  # ストロングパラメータの設定
  def question_params
    params.require(:question).permit(:title, :name, :content)
  end
end

終わりに

現在私はRailsを使ってCRUD実装を試みています。今後も学習内容を記事に出させていただくのでご意見や知見をいただけると嬉しいです。また、学習している段階の方々ともぜひ意見交換などができると嬉しく思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?