3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsでの`Unpermitted parameters`警告: 対処法と無視してもよい場合

Posted at

Railsアプリケーション開発中にはしばしばUnpermitted parametersの警告に遭遇します。この警告は、ストロングパラメータによって許可されていないパラメータがリクエストに含まれていることを意味します。この記事では、この警告をどのように扱えばよいのか、そしていつ無視しても安全なのかについて説明します。

Unpermitted parametersとは?

Railsでは、コントローラに送られてくるパラメータを管理するためにストロングパラメータが導入されています。これにより、不正なパラメータによるマスアサインメント脆弱性を防ぐことができます。Unpermitted parametersの警告は、ストロングパラメータによって明示的に許可されていないパラメータがリクエストに含まれている場合に出されます。

警告が出る原因

  • フロントエンドから予期しないパラメータが送信されている。
  • コントローラのストロングパラメータの設定が不足している、または誤っている。

警告を解消する方法

  1. パラメータを正しく許可する: 必要なパラメータが警告として出ている場合は、ストロングパラメータの設定を見直して、適切に許可するようにしましょう。

  2. 不要なパラメータを削除する: フロントエンドから送信されるが、実際には使用しないパラメータがある場合は、フロントエンドのコードを修正して送信しないようにしましょう。

警告を無視してもよい場合

  • データの保存や更新処理に影響を与えない追加のパラメータが含まれている場合。
  • アプリケーションのセキュリティポリシーに基づき、特定のパラメータを意図的に無視する場合。

Unpermitted parametersを無視しても良い例

以下のupdateアクションでは、スタッフが提供するサービスの情報(service_idsservice_feesservice_durations)を更新しています。

def update
  if current_staff || (current_company && @staff.company_id == current_company.id)
    params[:staff][:service_ids].each do |service_id|
      service = Service.find(service_id)
      fee = params[:staff][:service_fees][service_id].presence || service.default_fee
      duration = params[:staff][:service_durations][service_id].presence || service.default_duration
      @staff.update_or_create_available_service(service_id: service_id, fee: fee, duration: duration)
    end
    if @staff.update(staff_params)
      redirect_to staff_path(@staff), notice: 'スタッフの情報が正常に更新されました。'
    else
      render :edit
    end
  else
    redirect_to root_path, alert: 'アクセス権限がありません。'
  end
end
class Staff < ApplicationRecord
  # AvailableServiceの更新または作成
  def update_or_create_available_service(service_id:, fee:, duration:)
    available_service = self.available_services.find_or_initialize_by(service_id: service_id)
    available_service.fee = fee
    available_service.duration = duration
    available_service.save
  end
end

このケースでは、service_feesservice_durationsStaffモデルの直接の属性ではありません。これらは、AvailableServiceモデルを介して関連するサービスの料金や期間を更新するために使用されます。そのため、これらのパラメータはStaffモデルの更新処理には直接関与しません。

この場合、Unpermitted parametersの警告が表示されるかもしれませんが、それはstaff_paramsメソッドでこれらのパラメータが許可されていないためです。しかし、実際にはこれらのパラメータが適切に処理され、関連するAvailableServiceレコードが更新されています。

警告を無視する理由

この例では、service_feesservice_durationsパラメータは特定のビジネスロジックに基づいて処理されており、これらの値がStaffモデルに無関係であるため、Unpermitted parametersの警告を無視しても問題ありません。重要なのは、アプリケーションのセキュリティを損なわず、意図した通りにデータが処理されているかどうかです。

このようなケースでは、警告を無視する前に、以下の点を確認してください。

  • 警告されているパラメータが意図した処理に正しく使用されているか。
  • これらのパラメータがアプリケーションのセキュリティに影響を与えないか。

ベストプラクティス

  • セキュリティを優先する: 不要なパラメータが含まれている場合でも、それによってアプリケーションのセキュリティに問題が生じないように注意しましょう。
  • 警告の原因を理解する: Unpermitted parametersの警告が出る原因を理解し、必要に応じてアプリケーションのコードを修正することが重要です。
  • ドキュメントを参照する:RailsガイドやAPIドキュメントを参照して、ストロングパラメータの正しい使い方を確認しましょう。

結論

Unpermitted parametersの警告は開発中に有用な情報を提供しますが、すべての警告が直ちに対処すべき問題を示しているわけではありません。警告の内容を理解し、アプリケーションのコンテキストに基づいて適切に判断することが重要です。

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?