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

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

ただいまの
回答率

90.62%

  • Ruby on Rails

    6979questions

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

  • Ruby on Rails 4

    2404questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,135

steroid66

score 8

前提・実現したいこと

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

発生している問題・エラーメッセージ

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

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

該当のソースコード

class HogeController
  def create
    if params[:hoge] == "true"
      #処理A
    elsif params[:hoge] == "false"
      #処理B
    else
      #処理C
    end
  end
end

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

class HogeController
  before_action :check_params, only: [:create]

  def create
    if params[:hoge] == "true"
      #処理A
    elsif params[:hoge] == "false"
      #処理B
    end
  end

  private

  def check_params
    unless params[:hoge] =~ /\A(true|false)\z/
      render text: "Bad Request", status: 401
    end
  end
end

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/06 11:54

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

    キャンセル

  • 2017/01/06 12: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"
    のセットで判断するとか?

    いずれにしても、心配し過ぎ、やり過ぎになるとメンテナンスコストが跳ね上がるので
    アプリの特性に合わせて手を抜けるところは抜いたほうがいいかなと思います。

    キャンセル

  • 2017/01/06 12:37

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

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    6979questions

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

  • Ruby on Rails 4

    2404questions

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