ドットインストールのsinatra入門第15,16回のCSRS対策について
CSRFってナンジャラホイって状態だったので、
CSRFからSinatraでの対策方法までを調べました。
目次
CSRFとは
IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第4章 セッション対策:リクエスト強要(CSRF)対策
リクエスト強要(CSRF:Cross-site Request Forgery)とは、別のサイトに用意したコンテンツ上の罠のリンクを踏ませること等をきっかけとして、インターネットショッピングの最終決済や退会等Webアプリケーションの重要な処理を呼び出すようユーザを誘導する攻撃である。
通常、常時ログインなどでは、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::Csrf
でCsrf対策をオンにする。
セッション保持の際にシークレットキーを仕込む。
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が送信先でよろしくやってくれる。