質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

653閲覧

【Rails】rails5でストロングパラメータに指定しなくとも投稿できるのは何故?

zackieeee

総合スコア16

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

1クリップ

投稿2019/06/25 01:15

編集2019/06/25 01:17

rails初学者です。
ストロングパラメータについて学んでいたのですが、課題として作ったアプリケーションにおいて、一部カラムでストロングパラメータを使わなくてもDBへの登録ができてしまうのが腑に落ちず、理解があっているのか質問させてください。
件のコードは以下のような感じです。

rails5(gem

1test.rb 2 3Class TestController < ApplicationController 4 5・・・中略 6#フォームから入力されたデータをTestモデルに登録するメソッド 7#その際、test_paramsメソッドを呼び出す 8def create 9 Test.create(image: test_params[:image], text: test_params[:text],user_id: current_user) 10end 11 12・・・中略 13#createメソッドから呼び出され、引数となっている値がストロングパラメータとして設定されているか検証 14#falseとした場合は、DBへの登録を制限する 15private 16def test_params 17 params.permit(:image, :text) 18end 19

###【質問内容】
①以下の理解であっているでしょうか。
ストロングパラメータ自体がViewから引き渡されたparams内に定義されたカラムを検証対象としている。
そのため、params[:XXXX]を直接createで指定するとストロングパラメータ不使用でエラーとなる。

ただし、paramsを使わずに設定した値(上の例だと"user_id:")は、ストロングパラメータの包囲網には引っかからず、普通に登録できてしまう。

②どうするのがベターなのか。
ユーザからリクエストを受けるデータは全てparamsに格納されるので基本的にセキュリティ的な問題は無いという理解ですが、個人的には、current_user自体もセッション情報だと思うので、ユーザ入力情報と同義なのではと・・・。
ただ、”なりすましによる改ざん”と今回のストロングパラメータで回避しようとしている事象は違うので気にしなくて良いと言う結論なのでしょうか・・・とか、纏まらず、うやうや考えています。

そのため、書き方として、どちらがいいのか、ご意見をください!!!
また、どちらも使う場合、利用ケースを教えてくださると嬉しいです!!!!

1.params指定以外の設定値は、ストロングパラメータを経由しない
例)今回の参考コードと同一
2.params指定以外の設定値も、ストロングパラメータ検証用のメソッドを経由する
例)以下のようにストロングパラメータの検証用メソッドに値をマージする

test.rb Class TestController < ApplicationController ・・・中略 #フォームから入力されたデータをTestモデルに登録するメソッド #その際、test_paramsメソッドを呼び出す def create  Test.create(test_params) end ・・・中略 #createメソッドから呼び出され、引数となっている値がストロングパラメータとして設定されているか検証 #falseとした場合は、DBへの登録を制限する private def test_params params.permit(:image, :text).merge(user_id: current_user.id) end

※初心者課題のため、モデル更新にもform_tagを利用しています。
そのため、paramsメソッドに続く'require'メソッドの記述がありませんが、これは意図したものです。

初心者につき、明後日な質問をしているかもしれません。
長文・蛇文となり、申し訳ございませが、ご教示何卒よろしくお願いいたします。

kentigersv👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、Strong Parameterが何のためにあるのかといえば、Mass Assignment脆弱性を防ぐため(params[:user]とそのまま投げ込んで、意図しない列まで書き換わるという問題への対策)です。なので、1列ごとにピックアップするのであればStrong Parameterに頼らなくても全く問題ありません。


①以下の理解であっているでしょうか。

はい、大筋では間違いありません。

②どうするのがベターなのか。

「一部の列しか書き換えない」という意図を、Strong Parameterで表現するか、各列を明示的に宣言して表現するかの問題なので、元のコードの書き方で構いません(下手にparamsmergeしてしまうと、mergeしたものがpermitされていないとみなされて、うまく動きません)。

投稿2019/06/25 01:44

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zackieeee

2019/06/25 09:33 編集

ご回答いただき、ありがとうございます! (訳わからないこと書いてたので、訂正します!!) ①ありがとうございます! ②ありがとうございます!そもそも1カラムずつ定義するなら、ストロングパラメータを使用する必要性はないんですね。実機確認して、ストロングパラメータ介さなくても登録ができることを確認しました! ただ、マージについては、何のためにあるか、やはり不明です。 単にcreateの引数として、user_params一言で終わらせたいから…とかでしょうか? よろしければ、ご教示いただけると嬉しいです。
maisumakun

2019/06/26 08:54

paramsのmergeはHash#mergeがあったから付いている程度のもので、「入力フォームで複数のキーに分かれてしまっているものをmergeしてからpermitする」というような状況でもないとあまり役には立たなさそうです。
zackieeee

2019/06/28 12:36

すみません、返信が遅くなってしまいました。 ありがとうございます。 なるほど、例えばviewのform_forを別キーで複数作って、それらをハッシュマージしてpermitしたい。と言う感じですよね。 なんとなく、理解が深まりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問