完全な信頼性を誇るブラウザ上パスワードリンク。今までURLを暗号化していた自分は一体何なんだろうって・・・
正しいパスワードを入力したときのみ、隠されたページにジャンプさせるパスワードリンク。
CGIを使用しないパスワードリンクでよくあるパターンは、パスワードの一致判定を無視したり、巧妙に暗号化を施すもののだが、前者は不一致のとき404エラーページに飛ばされ、後者(昔パスワードリンク(2)などを作っていた)は暗号化を解除される恐れが尽きない。そこでこのパスワードリンクでは、入力されたパスワードの名前を持つファイルをダウンロードさせ、正常にダウンロードできればファイルの中のURLにジャンプさせるという方式を考えた。
これはファイル名そのものをパスワードにする点において、前者のようなパスワードとジャンプURLの相関関係が一切ない安全性を確保でき、更に404エラーが表面化せず、パスワードが間違っていることを判別できるため、後者のように一致不一致を知ることができる。
半角英数でパスワードを入力。(このデモのパスワードはpassword123)
まず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>
自分自身の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>
正常に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";