まだなにもない空間:IndexJavaScript実験場 Top>アクセス制限 5
*

JavaScript実験場

アクセス制限をかける -改造編・2-

Index

JavaScript実験場 Topに戻る

パスワード・URLの秘匿

ここからは、JavaScriptの機能を使って、パスワードやURLを撹乱するスクリプトを考えていきます。 なお、一つ注意するべきことは、ここでパスワードやURLを変換した暗号(なんだか大袈裟ですが…)は、実際にそれを利用するHTMLなどとは別のページで生成する必要があります。 そうしないと、何のために暗号化しているかわかりませんよね。 ですので、ローカル側で暗号化するツールになるページを組んで、そこで生成した物を変数に代入するよう記入する形になります。 もちろん、実際に公開するページには、必要に応じて暗号をデコードするスクリプトを仕掛けないといけません。

とりあえず、ここではまず、前ページの最後に書いた3つの方法について、一つずつ簡単に説明していきます。

正規表現の利用

JavaScriptには、変数などに収められている文字列やStringオブジェクトの中に、特定の文字列が含まれているかどうかを検索し、その目的の文字列があった場合にその内容を置き換える、「replace()」メソッドが用意されています。

このメソッドは、「文字列オブジェクト.replace("検索する文字列","置換後の文字")」のように記述します。 ただ、この記述方法では、検索条件に適合するはじめの文字列しか置換できません。 検索条件の設定をより詳細に設定したい場合は、これとは別に、Perlのパターンマッチ演算子のような記述方法を取ることができます。 この記述を利用する場合は、「文字列オブジェクト.replace(/検索する文字列/,"置換後の文字")」のように記述します。 ただ、これだけでは前述のものと同じ内容です。 こちらの記述方法を取るメリットは、検索の条件をオプション指定して、動作を拡張できることにあります。 検索条件のオプション指定は、「/検索する文字列/*」と「*」の部分にオプションを設定することで行います。 ここでは、文字列に含まれる複数の検索対象を置換したいので、「g」オプションを指定します(gはグローバルのgです)。 ちなみに、通常では大文字小文字も区別して検索を行うので、そこが食い違うと検索対象にヒットしない場合があります。 検索する文字列の大文字小文字を区別したくない場合は、「i」オプションを追加します。

ここでは例として、ここで作ったアクセス制限スクリプトで利用しようと思っている置換動作を記述しておきます。

例:
 txt=txt.replace(/\./g,"\;");
 txt=txt.replace(/\//g,"\&");

例の中のtxtは、文字列を格納している変数名です。 別の文字列オブジェクトを対象にしている時は、適宜置換動作を適用したいオブジェクトを指定するようにしてくださいね。 ここでは、変数txtに格納されている文字列について、上の行ではそこに含まれるすべての「.」を「;」に、下の行ではそれに含まれるすべての「/」を「&」に置換し、それを再び変数txtの中に格納させる指定が記述されています。 それぞれの置換対象・置換後の文字の前につけられている「\」は、エスケープシーケンスといって、スクリプト内で特別な意味を持っている文字について、それをスクリプト中にあるスクリプトとして処理される文字としてではなく、単なる文字として扱うために記述するおまじないです(念のためちょっと大袈裟に入れてあります(^_^;))。

これを適用すると、仮に変数txtに「http://www.***.com/」という文字列が格納されていた場合、文字列は「http:&&www;***;com&」に変換されて、変数txtに再び格納されます。 なお、ここでは「.」「/」を「;」「&」に変換しましたが、これは当然置換する対象になる文字列の中に、これらの文字が出現しないことを見込んで指定しています。 もしこれらの文字が変換前の文字列に含まれる場合、正確に元の文字列に戻すことができなくなりますので、置換後の文字には文字列中に出現しない文字を選定する必要があります。

変換を元に戻すには、この処理を逆にすればよいだけです。 置換対象の文字と、置換後の文字を、それぞれのしていないで入れ換えれば、元に戻ります。

例:
 txt=txt.replace(/\;/g,"\.");
 txt=txt.replace(/\&/g,"\/");

文字列の並べ替え

JavaScriptには、文字列オブジェクトなどを操作するメソッドがいくつも用意されています。 これらを利用して、文字列の並び順を入れ換えることも可能です。 ここでは簡単に逆順に並べ替えるようなスクリプトにしてみましょう。

ここでは、並び順を一文字ずつ逆にしていけば良いので、文字列から1文字分を取り出す「charAt()」メソッドを利用します。 このメソッドは、「文字列オブジェクト.charAt(*)」のように記述し、この指定で文字列オブジェクトの中の*番目の文字を抜き出します。 それを繰り返し利用して、変数の中に順に代入していきます。

ここで処理の繰り返しを行わせるには、「for」命令文を使います。 for命令文は、「for (初期値;条件設定;1ループごとに設定値に加える修正){条件が真であるときの処理}」のように記述します。 for命令文は、設定した条件が真である場合には処理を行い、もう一度ループの先頭に戻って条件に適合するかどうかを判定します。 つまり、設定した条件が偽になるまでの間、同じ処理を繰り返すことになります。 ここでは文字列を逆順に並べ替えたいので、文字列の一番最後の文字を抜き出し、それを変数内に追加していく、という処理を行います。 ループさせる条件としては、設定値の初期値を文字列に含まれる文字数とし、上記のcharAt()メソッドで参照する位置が先頭の文字を過ぎるまでの間、条件の値を1ずつ減らしながらループを繰り返させます。 文字列に含まれる文字数は、lengthプロパティ(「文字列オブジェクト.length」)で取得できます。 とりあえず、ここでソースの実例を書きます。

例:
for (j=txt.length; j!=-1; j--;) {
 txt2+=txt.charAt(j);
}

上の行からもう一度解説しますね。 まず、for命令でループが設定されています。 括弧内の設定を噛み砕くと(上にも書いてますが…)、ループに入る際、変数jに初期値として「txt.length」の値を与えます(lengthプロパティは数値が返されます)。 そして、変数jが「j!=-1(-1ではない)」の場合には、ループを繰り返し実行させます。 また、一回ループが終わるごとに、変数jから1を引き、変数jに返す処理(「j--」)を行います。 2行目は文字列の操作部分です。 ここでは、変数txt2に変数txtに収められている文字列のj番目の文字を抜き出して加え、それを変数txt2に返す指定がされています。 for命令文の繰り返し処理の部分は、きちんと括弧を閉じましょう。

既にお解かりかもしれませんが、ここで使用している「変数x--」という記述は、変数xから1を引き、その値を変数xにその値を代入させる演算子、「変数x+=任意の値」という記述は、変数xに任意の値を加え、それを変数xに代入させる指定です。

この部分の指定を実行すると、仮にtxtに入っている文字列を「reversed words」とした場合、txt2には「sdrow desrever」と変換されます。 この変換を元に戻す場合は、txtに変換した後の文字を入れ、そのまま同じ処理を行うだけです(単にひっくり返っただけですからね)。

ASCII形式(URL形式)の文字列に変換する

ASCII形式は文字コードの形式の一つです。 テキストベースのファイルなどは、ASCII形式で管理されていることが多くあるようですね。 FTPなどのときの転送モードのASCIIモードのそれと、指しているものは同じです。 JavaScriptには、文字列をASCII形式に変換するメソッドがあります。 日本語や一部の半角文字は、ASCII形式に変換すると、符号化されて、ぱっと見には何かわかりにくくなります。 半角英数字と一部の半角記号は変換を受けませんので、そのままになってしまいますが…

文字列をASCII形式に変換する場合は、「escape()」メソッドを使います。 具体的には、「escape(変換対象の文字列オブジェクト)」のように記述します。

例:
cod=escape(txt);

上記のように記述すると、変数txtに格納されている文字列が、ASCII形式の文字列に変換されて、変数codに代入されます。 ASCII形式の文字列をデコードするときは、「unescape()」メソッドを利用します。 unescape()メソッドの具体的な記述方法は、escape()メソッドと同じです。

なお、ここで注意するべき点があります。 ASCII形式は、もともとアメリカで情報共有のために策定された規格で、基本となる部分には日本語など英語以外の文字についてのコードは含まれていません。 英語以外の言語に関しては、ASCII形式の基本部分で利用されなかった拡張領域を使用して、独自に拡張した文字コードの規格を設けて利用している形になっています。 しかし、日本語用に拡張された文字コードの規格には、統一規格はなく、複数のコード体系が存在しています。 それが、問題を起こす場合もあります。 実は、Internet ExplorerとNetscapeでは、日本語のASCII形式への変換に使う文字コードの実装が違います。 ですので、IEで日本語の文章をASCII形式に変換した文字列を、Netscapeに渡して復元スクリプトでデコードすると、エンコードやデコードのスクリプトが同一ブラウザ上で問題なく変換・復元できる場合でも、文字化けします(逆も同じ)。 そのため、日本語を含む文字列を変換・復元させる場合は、ブラウザに合わせて複数の文字コード規格で生成したコードを用意し、ブラウザごとに引き渡す値を変更させる必要があります(あるいは、共通変換できるスクリプトを探すのもいいかも。とほほさんのページにありましたっけ。)。

URLについては日本語が含まれる可能性は今のところありませんから、このブラウザによって利用する文字コード表が違う問題は無関係です。 が、パスワードには日本語を利用することも可能ですから、もしパスワードに日本語を利用する場合は、ブラウザごとに生成されるコードを振り分けて渡す仕掛けを設けるように注意してください。

次は、このページで解説した3つの方法を組み合わせて、実例となるスクリプトを組んでみます。

ご意見・ご感想・ご質問・お気付きの点などについては、下記連絡先までお寄せください。
連絡先:ki_ng@mail.goo.ne.jp
inserted by FC2 system