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

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

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

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

9179閲覧

[rails] controller内でparamsの値によって処理を分けたい。

steroid66

総合スコア14

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/01/04 05:52

###前提・実現したいこと
rails controllerのcreate処理内でparams[:hoge]の値によって処理を分けたい。

###発生している問題・エラーメッセージ
hidden_fieldで定義しているパラメーターhogeの値はchormeの検証ツールなどHTML上で改竄できるので、悪意のあるユーザによって改竄されると、予期しない処理を行えてしまう。

html

1<input type="hidden" name="hoge" id="hoge" value="true"> 2# ここのvalueを検証ツールなどでfalseに改竄されると、予期しない処理に分岐される。

###該当のソースコード

ruby

1class HogeController 2 def create 3 if params[:hoge] == "true" 4 #処理A 5 elsif params[:hoge] == "false" 6 #処理B 7 else 8 #処理C 9 end 10 end 11end

paramsを使用しないで処理を分岐できる方法か、改竄されないような方法はありませんでしょうか。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

外部からの入力が改ざんを防ぐ方法はないので、必ずサーバ側(コントローラ)で値の妥当性をチェックしないといけません。
また、外部からの入力はparamsで受け取る方法しかないので、paramsを使わないという選択肢もありません。

予期しない不正な値については、きれいな画面でエラー表示する必要もないので、
不正リクエストを表すHTTPステータスコード401で、単にBad Requestというテキストを表示するだけで良いかもしれません。

ruby

1class HogeController 2 before_action :check_params, only: [:create] 3 4 def create 5 if params[:hoge] == "true" 6 #処理A 7 elsif params[:hoge] == "false" 8 #処理B 9 end 10 end 11 12 private 13 14 def check_params 15 unless params[:hoge] =~ /\A(true|false)\z/ 16 render text: "Bad Request", status: 401 17 end 18 end 19end

投稿2017/01/05 01:03

mingos

総合スコア4025

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

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

steroid66

2017/01/06 02:54

回答、ありがとうございます! 予期しない不正な値の場合ですと、ご教示いただいた通りのBadRequestで良い思うのですが、 例えば直前のviewで「はい」ボタンを押下時にparams[:hoge] = true を渡して処理A(正常処理)に進んでほしい場合、外部入力で値をfalseに変更されてしまうと、処理B(ユーザアカウントをロックする)に進んでしまう危険性は防げないでしょうか。。
mingos

2017/01/06 03:23

コントローラから見たらparams[:hoge]の値がtrueまたはfalseであれば正常な操作であり、 その値に従って処理すれば良いのであって、VIEW側で直前に何をされたかは問題ではないですよね。 普通にブラウザで操作する一般ユーザは、それで特に不利益を被るわけではないですし。 今回の質問のコードでは、params[:hoge]しか登場しないので、 この1つの値だけではどう頑張っても操作の流れの正当性までは保証できません。 <input type="hidden" name="hoge" id="hoge" value="true"> <input type="submit" name="btn_yes" value="はい"> <input type="submit" name="btn_no" value="いいえ"> 例えば、こういうボタンがあるとして、 サブミットはクリックされたボタンの値だけがparamsにわたってくるので、 params[:btn_yes] && params[:hoge] == "true" params[:btn_no] && params[:hoge] == "false" のセットで判断するとか? いずれにしても、心配し過ぎ、やり過ぎになるとメンテナンスコストが跳ね上がるので アプリの特性に合わせて手を抜けるところは抜いたほうがいいかなと思います。
steroid66

2017/01/06 03:37

なるほど!ボタンの名前とセットで判断できるのですね。。 確かに悪意を持ったユーザーに対してどこまでやるかっていうのは、コードの保守性も考えるとおっしゃる通りですね。どこまでやるかは考えてみます! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問