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="✓" /> <input type="hidden" name="authenticity_token" value="kHbl258N5/V5eChnjoZ8P1QhionN978xO..." />
authenticity_tokenの後に続くvalueがトークンになっています。
Railsでは、リクエスト処理時にアプリ側で保持しているトークンと、
リクエスト情報として送信されるトークンと比較し、
一致していればそれ以降の処理を行います。
もし一致していない、またはトークンそのものが存在しないと、
ActionController::InvalidAuthenticity Token という例外を発生します。
CSRF対策を行うprotect_from_forgeryメソッド
ここで疑問なのですが、ビューヘルパーを使わずにフォームをつくるとトークンが発行されず、よってエラーが発生するのかなと思いした。
ですが実際には、ビューヘルパーをつかわずとも、値がアプリケーション側に渡りました。
ビューヘルパーの利用は絶対ではないということでしょうか。
絶対ではないとなると、不正なフォームをつくられても、結果的に処理が実行されてしまうのではないかと思いますが、ビューヘルパーによるCSRF対策とはいったいどのような仕組みなのでしょうか。
Railsの仕組みがよくわかっていないため、質問が的を得ていませんでしたら申し訳ございません!
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/31 06:41
2019/05/31 09:31