【セキュリティ】referer洗浄

このページでは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にしか飛ばないように設計するようにする。