完全な信頼性を誇るブラウザ上パスワードリンク。今まで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";