強力なパスワードリンク

完全な信頼性を誇るブラウザ上パスワードリンク。今までURLを暗号化していた自分は一体何なんだろうって・・・

概要

正しいパスワードを入力したときのみ、隠されたページにジャンプさせるパスワードリンク。

CGIを使用しないパスワードリンクでよくあるパターンは、パスワードの一致判定を無視したり、巧妙に暗号化を施すもののだが、前者は不一致のとき404エラーページに飛ばされ、後者(昔パスワードリンク(2)などを作っていた)は暗号化を解除される恐れが尽きない。そこでこのパスワードリンクでは、入力されたパスワードの名前を持つファイルをダウンロードさせ、正常にダウンロードできればファイルの中のURLにジャンプさせるという方式を考えた。

これはファイル名そのものをパスワードにする点において、前者のようなパスワードとジャンプURLの相関関係が一切ない安全性を確保でき、更に404エラーが表面化せず、パスワードが間違っていることを判別できるため、後者のように一致不一致を知ることができる。

デモ

半角英数でパスワードを入力。(このデモのパスワードはpassword123)

Pass link

仕組み

まずCGIと同じ様にURLにパスワードの文字列をくっ付けてpass.htmlにデータを送る。pass.htmlはデータを受け取ると、"入力したパスワード.js"という外部JSファイルを読み込もうとする。予め"パスワード.js"というファイルを作っておき、パスワードが正しければ正常にファイルを読み込むことが出来る。ファイルが読み込めたかどうかでパスワードの当たり外れを判定し、読み込んだファイルに入っているURLにジャンプさせる。

パスワードを日本語にしたい時はCharCodeAt等を使ってファイル名に使用可能な半角英数字に変換すればよい。URLとして適合できる文字形式に変換すれば、どんなパスワードでも利用できる(具体的なプログラムは挙げない)。

ソースコード

入力部分

CGIへのリクエスト送信同様の記述をする。送信メソッドは指定しないが、URL末尾に文字列をくっつけなければいけないので初期値のGETを使用する。

<form action="pass.html"><fieldset>
<legend>Pass link</legend>
<input type="text" value="" name="pass">
<input type="submit" value="GO">
</fieldset>
</form>
pass.html 送信されたパスワードを判定(head内)

自分自身のURL末尾から入力パスワードを取り出し、パスワードと同じ名前のJavaScriptファイルを読み込むHTMLを書き出す。

<script type="text/javascript">
<!--
var pass_file = location.search.split("pass=")[1].split("&")[0];
var Pass_true = false;
var target_URL = "";
document.write('<script type="text/javascript" src="'+pass_file+'.js"><\/script>');
//-->
</script>
pass.html 送信されたパスワードを判定(body内)

正常にJSファイルが読めていれば、読み込みフラグがONになり隠されたページのURLも正常に読み込めているので、隠されたページにジャンプさせる。読み込めていなければエラーを表示する。

<script type="text/javascript">
<!--
if(Pass_true){
        location.href=target_URL;
        document.write('<p><a href="'+target_URL+'">'+target_URL+'<\/a><\/p>');
}else{
        alert("パスワードが違います!");
        document.write('<p>エラー,パスワードが違います。<\/p>');
}
//-->
</script>
判定用外部ファイル(ファイル名はパスワードの値)

読み込みフラグと隠されたページのファイルパスを変数として書いておく。

Pass_true = true;
target_URL = "answer.html";

ページ情報

作成日時
2005/08/26
最終更新日時
2005/08/26
HTML4.01版
index.html
XHTML1.1版
index.xhtml
XML原本
index.xml