このページではrefererの洗浄について説明します。
そもそもrefererとは?
refererがわからない方もいると思うので説明します。
refererとは一言で言えば、元サイトのURLです。
例えばあなたがヤフーのトップページから、このサイトにアクセスしたとします。
その場合referer欄には
referer:https://www.yahoo.co.jp/
という情報が載ります。
どのページからきたかの情報がrefererです。
元のページのURLがヘッダー情報として残るのです。
あなたがネットサーフィンで色んなサイトを見て回っている時、本人は気付きませんが実は
自分はどこどこの者でこっちのサイトから飛んできました^^
という情報を持って歩いています。
アクセス解析する上では貴重な情報ですが、悪意ある人に悪用される事もあります。
referer洗浄とは?
referer洗浄というのは、別サイトに飛ぶ時に自サイトのURLをなるべく綺麗にして飛ばさせる事です。
例えば自サイトのURLが
http://sample.com?user_id=999&pass=1234
というセキュリティ的にとんでもないURLのページかもしれません。
このページから他サイトに飛んだ時、referer欄には
http://sample.com?user_id=999&pass=1234
の情報が残ります。
悪意ある人がこのrefererを見たら涎を垂らして喜ぶでしょう。
ですので、こういったrefererを相手サイトに残したくない時にreferer洗浄をします。
このページから外部ページに飛ぶ時に、一旦自サイト内のページを経由して飛ばす事でrefererを綺麗にする事が出来ます。
例えば
http://sample.com?user_id=999&pass=1234
↓
http://sample.com/cussion/
↓
外部サイト
と間にクッションページを入れるのです。
こうすれば相手側のアクセス解析のreferer欄に残るのは
http://sample.com/cussion/
のURLになります。
1番のreferer対策は外部サイトを作らない事です。
自分のサイトから外部へのリンクを貼らない事。
これがセキュリティ的には一番になります。
でもどうしても外部にリンクを貼りたい時は、そのページのURLが外部に漏れる事を想定して下さい。
URLに大事な情報を入れない
これは当然大事な事になります。
そもそもURLに機密情報が載っている時点で問題があるといえます。
どうしても外部リンクを貼りたい時に必要となるのが
referer洗浄
となります。
referer洗浄方法
自サイトから外部サイトにリンクを貼る時に
クッションページ
を経由させる事でrefererを綺麗に変える事が出来ます。
このリダイレクト用のクッションページですが作る時にいくつか注意点があります。
1.ページのスキームを限定する
2.利用者にもメッセージを伝える
3.データベース等に保管してあるURLに飛ばすようにする
この3つを守って下さい。
一つ一つ説明します。
1.ページのスキームを限定する
スキームとはURLの頭についている
http://
https://
の事です。
これをhttp以外うけつけないように構築して下さい。
理由はhttp以外をURLの頭にくっつけるXSSという攻撃方法から守るためです。
クッションページというのはreferer洗浄には有効ですが、実はハッカーに狙われやすいページになります。
例えばクッションページのURLが
http://sample.com/cussion/
このページで本当にただクッションさせるだけで、例えば
javascript:location.href=悪いサイトURLhttp://sample.com/cussion/
のようなデータも受け取ってしまいます。
スキームをhttpに限定すれば、このような攻撃を無効に出来ます。
2.利用者にもメッセージを伝える
クッションページは攻撃者に狙われやすいです。
利用者は気付かない間にクッションページから指定サイトに飛ばしてもいいですが、それよりも
「外部サイトに移動していいですか?」
のようなメッセージを表示して、クリックしたら移動するようにします。
こうする事でクッションページを悪用されにくく出来ます。
どうして悪用されにくくなるのか説明します。
例えば悪い人が、ユーザーを勝手にあるサイトに誘導したいがrefererを洗浄させたい時
悪い人のサイト
↓
誘導したいサイト
↑これだと誘導したいサイトに悪い人のサイトのrefererが残ってしまいます。
そんな時はどこかのクッションページを利用して
悪い人のサイト
↓
クッションページ(気づかずにリダイレクト)
↓
誘導したいサイト
↑このように利用されると、誘導先サイトに勝手に移動させてなおかつreferer洗浄も出来る便利なページとして悪い人に利用されます。
ただこの時にクッションページでメッセージが出てクリックしないと先に進めないページなら・・?
悪い人のサイト
↓
クッションページ(メッセージが画面に出てリダイレクトはリンククリックが必要)
↓
誘導したいサイト
↑これだと誰かが悪い人に勝手にリダイレクトされてても、このクッションページで気付きます。
「あれ?なんだこのぺーじ?
わかんないから戻ろう。」
となるので、悪い人はこのクッションページを利用しようとは思わないでしょう。
3.データベース等に保管してあるURLに飛ばすようにする
3つめですが、クッションページは悪用されやすいと説明してきましたが、例えばクッションページのリダイレクトをGETで受け取ったURLに飛ばす仕組みにしている場合
http://sample.com/cussion?url=https://www.yahoo.co.jp/
これでURLを受け取ってヤフーに飛ばすようにしている場合
urlに攻撃者がスクリプトを埋め込んで攻撃出来ます。
http://sample.com/cussion?url=javascript:・・・・
のように
このような攻撃を避けるために、あらかじめこちらで用意してあるURLにしか飛ばないように設計するようにする。