CSRF攻撃からWEBサービスを守る
CSRF攻撃?
クロスサイトリクエストフォージェリの略でCSRFといいます.
CSRFとは何か
リクエスト強要攻撃とも言うらしいです. 何かのリンクを踏んだ人が本当にそのリンクから発生されるリクエストを望んだかどうかわからない状態でサーバーがリクエストを処理してしまう攻撃のことです.
簡単に言えば
htt_p_://example.co_/post/message?title=▼▽というURLがあり,このURLにアクセスするとWEBサービスで▼▽という名前の日記が作られるとします.
HTMLにはhrefタグという,リンクを埋め込むことができるタグがあります.
このタグに「htt_p_://example.co_/post/message?title=何かの犯罪予告」を埋め込んだとして…
「このリンクを踏んだら5000兆円あげます!!!!!!」←こんなリンクあったら嘘だとしても踏みたくなりませんか?
このリンクを踏んでしまうとリンクを踏んだ人のパソコンからサーバーにリクエストが送られるので, 上の犯罪予告はリンクを踏んだ人がしたということになります.
意図せずにあなたが犯罪者となってしまう恐ろしい攻撃です.
どうすれば対策できるのか
これはなかなか難しいと思いました. いくつか対策方法があります.
1. リンクからのアクセスだけでサーバーの持っているデータを変更しない
上の例がそのまま当てはまってしまうので主にGETリクエストでは変更を許可しない実装が求められます.
2. WEBページに正規のサーバーでそのWEBページを生成/配布したことを証明するランダムな文字列を埋め込み、リクエストを受け取るとその文字列を検証する
ブラウザーに送られたWEBページが偽物ではなく,正規のものであることを示すために,サーバー側で事前にランダムに生成した文字列をページに埋め込み,その文字列をストアで管理,一定時間後に削除というやり方があります
サーバー側で作られたページであることがわかるので,安心してサーバー側でリクエストを処理することができます
サーバーサイドレンダリングにおいてはこの方式は有効ですが,RESTfulなAPIを用いる場合,この方法は通常使うことができません
2. WebStorageを使う
主に認証回り(ログインを必要とする処理において)考えなければならないものに対して「一部」有効です
例えばログイン後の一時キーの管理などです
WebStorageはJavascriptで扱うことができるストレージのことで,文字列や画像といった情報を保存することができます.Cookieの上位互換のような機能です.
WebStorageはJavascriptから読み込む際に,同一ドメインのページでしか読み込むことができないので,偽物ページによるCSRF攻撃に対しては有効です.
ただし,WEBページがXSSに対して脆弱性がある場合,保存した情報が盗まれる可能性があるので,ここに重要な情報を保存するのはあまりお勧めできませんが,Cookieと併用すれば有効なようです.
3. XMLHttpRequest や Fetch APIを使う
この2つの機能はブラウザー(Javascript)からサーバーにリクエストを飛ばす機能ですが、デフォルトで異なるドメインへのアクセスを制限する機能が付いています.
また,CORSをサーバー・クライアントで設定しリクエストを送れば,事前に設定した異なるドメインからのリクエストにも対応することができます.
4. CookieとWebStorageを併用する
CookieにはhttpOnlyというJavaScriptから読み込むことができないようにするオプションが存在します.
これを有効にすれば、秘密にするべき情報をXSS攻撃から守る対策となるわけですが,CSRFを防ぐことはできません.
そこでWebStorageにCSRF対策用の文字列を何らかの方法でサーバーから取得し,WebStorageに保存しておきます.
WebStorageは異なるドメインからの読み取りが不可能かつ,Cookieのようにリクエストに自動的に付与されることはありません.
またこの文字列は何らかの方法で盗まれたとしても,謎の文字列でありCookieの情報を読み取らなければ有効に使うことはできません.
CSRFの根本の原因は,自動的に識別情報が送られてしまうことにあるわけですから,明示的に送信されなくなりCSRF対策ともなるわけです.
この方法が一番安全に思えます.
最後に
調べてて疲れました. 読んだ方の中で間違いを見つけた/認識が間違えている等のご指摘はぜひコメントにお願いします.
できればこの辺の対策はライブラリに丸投げしたいところです.
コメント入力