CSRF対策はトークン埋め込み(+CookieのSameSite属性)が定番だが、Originヘッダを用いた対策もあると知ったため、試してみた。
結論
IE, Edge等で防御できないので、Originヘッダだけの対策は不十分。
トークン埋め込み、SameSiteの設定など、他の対策も取るべき。
※SameSite属性はIEで非対応のようで、またログイン不要サイトでもSameSiteでは対策できないため、泥臭いがトークンが一番確実
※追記 Can I useより、SameSite属性はIE11のwin10の2017 Fall Creators Update以降は有効とのこと。それ以前やWin7等は非対応。
試した結果
ブラウザ | 対策可否 | 備考 |
---|---|---|
Chrome | ○ | 同一ドメインでもorigin飛ぶ |
FireFox | ○ | 同一ドメインでもorigin飛ぶ |
Edge (非chromium版) | × | 別ドメインでもorigin飛ばない |
IE11 | × | 別ドメインでもorigin飛ばない |
※いずれも2020/6/15時点の最新版
意外なことに、Edgeが対応してないが、MDNを見ると、POSTでは送られないバグがあるとのこと。はやくchromium版になって欲しい。
* Not sent with POST requests, see bug 10482384.
IEについてはMDNには対応とあるが、送られている気配が無く、よくわからない。
Edgeが漏れる時点でこの対策だけを取る解は無いので、真面目に調べてない。
また試していないが、MDN曰くAndroid版FireFoxも明示的に有効にしないと送られないらしい。
なかなか足並みがそろっておらず、この対策だけでは厳しい。
調査方法
ごく普通のhtml fromの送信先を同一ドメイン、別ドメインと変えて、POSTリクエストのヘッダを見ただけ。
JavaScriptからの送信は確かめていないが、この試験の時点で適当な罠サイトでボタン押されたらアウトだということは分かる。