【CSRF】CSRFってナンジャラホイからSinatraでのCSRF対策について

ドットインストールのsinatra入門第15,16回のCSRS対策について
CSRFってナンジャラホイって状態だったので、
CSRFからSinatraでの対策方法までを調べました。

ドットインストールのsinatra入門第15回

目次

CSRFとは

IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第4章 セッション対策:リクエスト強要(CSRF)対策

リクエスト強要(CSRF:Cross-site Request Forgery)とは、別のサイトに用意したコンテンツ上の罠のリンクを踏ませること等をきっかけとして、インターネットショッピングの最終決済や退会等Webアプリケーションの重要な処理を呼び出すようユーザを誘導する攻撃である。

CSRFの概要
CSRFの概要

通常、常時ログインなどでは、cookieにセッション情報が格納されますが、Railsではリクエストのたびにcookieを自動的に取得する。 その際cookieはブラウザもしくはサーバに保存されているので、別サイトからリクエストが送られたときにも正しいcookieが使用されてしまう(認証が通ってしまう)

対策

準備

railsではrack_csrfというCSRF対策用のgemが用意されている。ので
$ gem instal rack_csrfでインストール

rack_csrfでは、sessionとformにtokenを仕込んでおいて、postされたときにsessionとformの値 が一致すれば正規の操作と判断する。

使用方法

Controller

Controller側に対して

use Rack::Csrf, raise: true
use Rack::Session::Cookie, secret: "hogehoge"

を挿入する。Rack::CsrfCsrf対策をオンにする。
セッション保持の際にシークレットキーを仕込む。

view

viewについては <form action="/create" method="post">などでPOSTする際に
<%= Rack::Csrf.csrf_token(env) %>などを入れておく。
こうすることで、POST時にtokenをhiddenで仕込んでおいて、送信先でチェックする。

またtokenのチェックを行うために、Ajaxでもtokenを仕込む。 その準備としてview側について、送信されたデータに対してdata-token="<%= Rack::Csrf.csrf_tag(env) %>"を入れておく。 これで_csrfの名前でjqueryにわたるので、jquery_csrf: li.data('token')を入れる。

これでtokenのチェックをgemが送信先でよろしくやってくれる。