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

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

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

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

Q&A

解決済

1回答

2711閲覧

Rails CSRF対策においてビューヘルパーを使う使わないの違いはどこにあるのでしょうか

hamasaki_haruya

総合スコア10

Ruby on Rails

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

0グッド

1クリップ

投稿2019/05/29 05:12

CSRF対策について調べていたところ、以下のような記事が参考になりました。

フォーム生成の際はビューヘルパーを使え

フォームやリンクを生成するときは、

form_forやlink_to等のビューヘルパーを利用するようにしましょう。
これによって、アプリ側でトークンと呼ばれる証明書のようなランダムな文字列が生成され、
フォームに埋め込まれるようにできます。

以下はform_forを用いたフォーム画面の例と、

ページのソースを表示したものを一部抜粋して記載しています。

_form.html.haml = form_for [@review] do |f| .form-group = f.label 'タイトル' = f.text_field :bookname, class: 'form-control', placeholder: 'Type a bookname' .form-group = f.label '言語' = f.select :language, [["",""], ["HTML&CSS","HTML&CSS"], ["Ruby","Ruby"]], {} .form-group = f.label 'レベル' = f.select :level, [["",""], ["初級","初級"], ["中級","中級"], ["上級","上級"]], {} .form-group = f.label '画像' = f.file_field :image .form-group = f.label '本文' = f.text_area :content, class: "form-control form-textarea" = f.submit '投稿', class: "btn btn-primary"
chromeの「ページのソースを表示」機能で展開されたソースコード <!DOCTYPE html> <html> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'> <title>FriendlyReview</title> <b><meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="D0b+EkIWQ2kuSoVqp2mzED5lsJP/hzsr8yugtFGaQ+XBC..." /></b> 省略 <form class="new_review" id="new_review" enctype="multipart/form-data" action="/reviews" accept-charset="UTF-8" method="post"> <input name="utf8" type="hidden" value="&#x2713;" /> <input type="hidden" name="authenticity_token" value="kHbl258N5/V5eChnjoZ8P1QhionN978xO..." />

authenticity_tokenの後に続くvalueがトークンになっています。

Railsでは、リクエスト処理時にアプリ側で保持しているトークンと、
リクエスト情報として送信されるトークンと比較し、
一致していればそれ以降の処理を行います。
もし一致していない、またはトークンそのものが存在しないと、
ActionController::InvalidAuthenticity Token という例外を発生します。

CSRF対策を行うprotect_from_forgeryメソッド

ここで疑問なのですが、ビューヘルパーを使わずにフォームをつくるとトークンが発行されず、よってエラーが発生するのかなと思いした。

ですが実際には、ビューヘルパーをつかわずとも、値がアプリケーション側に渡りました。
ビューヘルパーの利用は絶対ではないということでしょうか。

絶対ではないとなると、不正なフォームをつくられても、結果的に処理が実行されてしまうのではないかと思いますが、ビューヘルパーによるCSRF対策とはいったいどのような仕組みなのでしょうか。

Railsの仕組みがよくわかっていないため、質問が的を得ていませんでしたら申し訳ございません!
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

application_controller.rb に

protect_from_forgery with: :exception

とかかれてないですか?

かかれてなければかけば CSRF 対策が有効になるはずです

投稿2019/05/29 15:50

mypt

総合スコア170

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

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

hamasaki_haruya

2019/05/31 06:41

回答ありがとうございます! おっしゃっていただいたとおり、application_controller.rbにprotect_from_forgery with: :exceptionがございました。 しかし、deleteボタンですが、aタグで作成してもリクエスト時にauthenticity_tokenを発行しています。 どこの解説にもlink_toとヘルパーを用いないとトークンは発行されないとありますが、これはどういったことが起きているのでしょうか? よろしくお願いいたします!
hamasaki_haruya

2019/05/31 09:31

調べていたら、なんとなく自己解決できました。 aタグでもdata-methodを設定すると、ヘルパーと同じ役割をするそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問