まだ厳密に検証した訳じゃない。 -> それなりにマジメに検証した & 背景をちょっとだけ勉強した
攻撃が成立する条件
ここでカスタムヘッダが設定されてるので攻撃サーバー側は nginx なら以下みたいに設定する必要がある。
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
add_header Access-Control-Allow-Credentials true;
location / {
if ($request_method = OPTIONS ) {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept, X-XHR-Referer";
add_header Access-Control-Allow-Credentials true;
add_header Content-Length 0;
add_header Content-Type text/plain;
return 200;
}
}
Rails 側は実証コードも糞もあるか。
重要なのは OPTION ではちゃんと X-XHR-Referer を受け入れること。本番リクエストでは別に受け入れなくていい。普通の CORS の話です。
この状態で turbolinks デフォルトとかクレイジーでしょ => デフォルトから外す pull req を誰かが投げる => 「オープンリダイレクタ置くようなバカの為にデフォルトから外すのはおかしい」みたいな意見が出てくる => #128 みたいな炎上事案になる
— 未来世紀ひだまりスケッチの絶対の危機 (@ssig33) March 13, 2013
XHR Level 2 自体が人類にはまだ早すぎた感ある。