* 概要

[20] [[CSRF]] は、攻撃先 [[Webサイト]]の[[利用者]]を別の[[Webサイト]]から[[攻撃者]]が誘導し、攻撃先
[[Webサイト]]における当該[[利用者]]の権限で、[[利用者]] (や[[Webサイト]]の[[著者]])
の意図せぬ動作を引き起こせるような[[脆弱性]]・[[攻撃]]です。

[EG[
[21] 例えば次のような被害が起きることがあります。

[FIG(list)[ [22] [[CSRF]] 攻撃の被害例
- [23] 知らないうちに[[掲示板]]に勝手な内容で投稿してしまう
- [24] 知らないうちに[[電子商取引]]サイトで商品を購入してしまう
- [25] 知らないうちに [[SNS]] の[[足跡]]機能に名前を残してしまう
- [26] 知らないうちに会員制 [[Webサイト]]で[[ログイン]]状態にさせられてしまう
]FIG]

[27] 何を被害とするかは、[[著者]]と[[利用者]]の捉え方に依存するところもあります。
例えば[[Webサイト]]の[[アクセスカウンター]]の数値が意図せぬ形で増加しても、
迷惑ではあるが対策するほどの被害は受けていない、という認識はあり得ます。
]EG]

* プロトコル

[7] [[CSRF]] 対策のために使うことができる[[プロトコル要素]]には次のものがあります。
[FIG(short list)[
- [CODE(HTTP)@en[[[Origin:]]]]
- [CODE(HTTP)@en[[[Referer:]]]]
- [CODE(URI)@en[[[state]]]]
- [CODE(HTTP)@en[[[X-CSRFToken:]]]]
- [CODE(HTTP)@en[[[X-CSRF-Token:]]]]
- [CODE(HTTP)@en[[[X-Modhash:]]]]
- [CODE[[[rkm]]]]
]FIG]

* 検査

[FIG(steps)[
= [8] [CODE(HTTP)@en[[[Origin:]]]] が[[対象URL]]の[[起源]]と同じなら、問題ありません。
=- 問題があるとしたら、 [[CSRF]] 以外の脆弱性または設計の誤りです。
= [9] [[安全なメソッド]]なら、問題ありません。
=- 問題があるとしたら、設計の誤りです。
= [11] それ以外なら、 [[CSRF]] 攻撃でないことを確認しなければなりません。
=- [15] 多くの場合は外部[[起源]]からの[[非安全]]メソッドの要求を受け入れる必要はないでしょうから、 [CODE(HTTP)@en[[[Origin:]]]] や [CODE(HTTP)@en[[[Referer:]]]] の[[起源][URLの起源]]が[[対象URL]]の[[起源][URLの起源]]と異なれば、誤りと判断できます。
=- [10] [CODE(HTTP)@en[[[Content-Type:]]]] が 
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]、
[CODE(MIME)@en[[[multipart/form-data]]]]、
[CODE(MIME)@en[[[text/plain]]]] のいずれかなら、[[フォーム]]から送信されたかもしれません。
=- [12] [CODE(HTTP)@en[[[Authorization:]]]] も [CODE(HTTP)@en[[[Cookie:]]]]
もないなら、 [[XHR]] などから送信されたかもしれません。
=- [13] [[CORS]] [[preflight]] に返答しているなら、 [[XHR]] などから送信されたかもしれません。
=- [14] [CODE(ABNF)@en[[[auth-scheme]]]] が [CODE[[[oauth]]]] や [CODE[[[bearer]]]]
など [[Webブラウザー]]以外のものなら、[[フォーム]]から送信されたものではありません。
]FIG]

;; 
[17] [[PKP]] は、[[Webブラウザー]]に以上の条件に合致しない [[JSON]]
データを送信させることがあります。 ([CODE(HTTP)@en[[[report-uri]]]] 参照。)

* メモ

[1]
[CITE[高木浩光@自宅の日記 - クロスサイトリクエストフォージェリ(CSRF)の正しい対策方法]] <http://takagi-hiromitsu.jp/diary/20050427.html#p01>

[2] [CITE@en[Hixie's Natural Log: Different perspectives in the Web standards community]] ([TIME[2009-01-24 00:39:51 +09:00]] 版) <http://ln.hixie.ch/?start=1232666113&count=1>

[3] [CITE@ja-JP[高木浩光@自宅の日記 - クロスサイトリクエストフォージェリ(CSRF)の正しい対策方法]]
([[高木浩光]] 著, [TIME[2009-09-27 22:35:44 +09:00]] 版)
<http://takagi-hiromitsu.jp/diary/20050427.html#p01>

[4] [CITE@ja-JP[高木浩光@自宅の日記 - クロスサイトリクエストフォージェリ(CSRF)の正しい対策方法]]
( ([[高木浩光]] 著, [TIME[2011-02-22 10:37:01 +09:00]] 版))
<http://takagi-hiromitsu.jp/diary/20050427.html>

[5] [CITE@ja-JP[高木浩光@自宅の日記 - クロスサイトリクエストフォージェリ(CSRF)対策がいまいち進まなかったのはなぜか]]
( ([[高木浩光]] 著, [TIME[2011-02-03 19:09:35 +09:00]] 版))
<http://takagi-hiromitsu.jp/diary/20050703.html>

[6] [CITE@ja-JP[高木浩光@自宅の日記 - 暗黙的に形成する事実標準の話と回避策の話を混同してはいけない, 駄目な技術文書の見分け方 その1の2]]
( ([[高木浩光]] 著, [TIME[2010-05-30 18:09:39 +09:00]] 版))
<http://takagi-hiromitsu.jp/diary/20061115.html>

[FIG(quote)[
[FIGCAPTION[
[16] [CITE@ja[セキュリティ・ブラウザ環境について | ソニー]]
([[Sony Marketing (Japan) Inc.]] 著, [TIME[2015-06-10 15:26:55 +09:00]] 版)
<http://www.sony.jp/Security/index.html>
]FIGCAPTION]

> ストアは、ご利用者とストアとの間でのクレジットカード番号を含むすべての通信内容に対して、SSL(Secure Socket Layer)テクノロジーによる暗号化を施すなどして合理的な範囲内でセキュリティの強化に努めておりますが、更なる安全のため、My Sony ID(もしくはストアログインID)にてログインしている間は、ストア以外のウェブサイトを閲覧されないことをお勧めいたします。
> 万一、他のウェブサイトを閲覧される場合には、ログアウトしていただくことをお勧めします。なお、ログアウトされた場合、30分以内にログインされないとレジの商品が削除されますのでご注意ください。

]FIG]


[18] [CITE@en[Webmention]]
([TIME[2017-01-11 04:06:01 +09:00]])
<https://webmention.net/draft/#h-cross-site-request-forgery>

[19] >>18 ここで例示されている「[[CSRF]] 対策」は一体誰から何を守るためのものなんだろう。。。
ここに書いてある通りのことをやっても、カジュアル [[CSRF]] 攻撃に第三者を巻き込むことを若干防げる程度じゃないかな。。。

[28] [CITE[How to Mitigate CSRF Using Origin Headers?]]
([TIME[2017-06-28 13:54:47 +09:00]])
<http://lenxwei.blogspot.jp/2014/08/how-to-mitigate-csrf-using-origin.html>