特定のブラウザである条件がそろうと,Basic 認証 *1のパスワードが外部に漏れる可能性 *2があるようですね....これって広く知られていることなのでしょうか.
再現に必要となる条件は,以下の通り.
- Javascript が有効である
- Basic 認証に必要なユーザ名,パスワードを URL に含めている
例えば,http://example.com/ の Basic 認証にユーザ名「USER」,パス ワード「PASS」が必要な場合は,http://USER:PASS@example.com/ にアク セスすることにより,ブラウザでのユーザ名,パスワード入力を省くこと が出来ます.
この時,認証が必要なページからリンクをたどりその他のページに移動した とします.すると,ブラウザによっては,Javascript により refere に含 まれるユーザ名とパスワードを取得できてしまうようです.
手元でデモページを作って試してみると,Netscape や Mozilla では大丈夫のようですが,IE だと見事に漏れていますねぇ.
まず,ブラウザの Javascript 機能を有効にして,http://nyam.helios.dyndns.org/personal/referer-test/
にアクセスする.リンクが一つだけ表示されるので,それを辿る.ここで表示される「STEP1」のページは,Basic 認証で保護されたページ ですが,URL 中にユーザ名,パスワードが含まれているので,認証用の画 面が開くことはありません.
「STEP1」の画面に表示されている3つのリンクをそれぞれ辿る.
3つのリンクは,STEP2 のページに辿りつく道筋が違います.
- フツーにリンク
- リンク先から HTTP ヘッダの Location でリダイレクト
- meta http-equiv="refresh" で自動的に移動
これが Javascript の仕様なのか,IE の仕様なのかは知りませんが,いずれにせよサイト管理者にとっては頭の痛い問題かもしれません.個別のユーザに個別の情報を公開している場合は,パスワードを漏らしたユーザが被害を被るだけなのでまだましですが,複数のユーザに共通する情報を提供している場合は特に問題ですね.
実は,このサイトでもそういったページが幾つかあるのです.w3m ではユーザ名が referer に残るってことは知っていたのですが,まさかパスワードまで残る場合があるとは思いませんでした.こうなると,URL にパスワードを含めるのを禁止したほうが良いかもしれません.
しかし,そういう機能がある以上は,禁止したことところで大した強制力をもつわけでもありませんし,サイト側で対処できるならそうしたいものです.デモで試したところでは,「meta http-equiv="refresh"」で移動させた場合では Referer の値が無くなる *3ようなので,しばらくはこれで行きたいと思います.
- HTTP とセキュリティ まるも製作所 茂木和洋氏

コメントする