|
▼▽ Instant Access Menu ▽▼ |
Javascriptのescape関数で判読を難しくする
一方、Netscapeでは、escape関数を用いると文字列をISO-Latin-1コード(ASCIIコード)に変換してくれます。例えば、「あ」という文字は、「%82%A0」というふうに変換してくれます。2バイト文字は1バイト(8ビット)ずつ、16進数に変換しています。
このesacpe関数と対になっているのがunescape関数です。unescape関数は、エンコードされた文字列をデコードし、元の文字に戻す機能があります。この2つの関数(escape、unescape)を用いて、HTMLソースコードの解読を難しくさせることが可能です。例えば、
と書けば、IEでは「あいうえお」とボールドで表示されます。タグの部分(「<b>」と「</b>」)も16進数に変換されていますので、ぱっと見は分からないですね。下の簡単なツールで試してみてください。左側のテキストエリアに何か文字を入力すれば、escape関数でエンコードされた文字列が右側のテキストエリアに表示されます。 しかし、ここまで読み進んできて、何か気がついた方もおられることでしょう。先述のように、IE4.0以降ではescape関数でエンコードされた結果はISO-Latin-1コードではなく、unicodeです。この方法でソースを隠そうとした場合、IE用とネットスケープ用と2種類準備しなければならないことになります。これはかなり面倒です。 そこで、IEでもネットスケープでも動くescape関数及びunescape関数を自作すればいいことになります。IEでもurlencodeさせる関数を自作するか、ネットスケープでもunicode(%u****。*は0-9、A-Fのいずれかの文字。16進数の文字列です。例:%u3042は「あ」を表します。)に変更させれば良いことになります。恐らくネットスケープでもunicodeに変換する関数を自作する方が簡単です。「JavaScriptを外部ファイル化する(CGI編)」に自作のdecode関数(unicode文字列を通常の文字列に変換する関数)のサンプルコードを紹介しています。通常の文字列をunicode形式にエンコードする方法の詳細は説明していませんが、CGIやPHPなどのサーバサイトでプログラミングすることも、下記のように、自作のJavaScript関数(IEのescape関数と同様の変換をネットスケープでも行ってくれる関数)を作成することも可能でしょう。
ただ、更に重大な問題があります。decode関数を使えば、ブラウザは作成者の意図したとおりにユニコード形式の文字列を人間が読める文字に変換して表示してくれているのですから、人間だって、decode関数でデコードさせている対象の文字列及び、decode関数のソースさえ分かれば、簡単にHTMLソース全体を読むことができるようになってしまいます(ここで注目すべきは、通常の文字列をどのようにエンコードしているかを知る必要は全くないということです。)。ちょうど、上にある簡単な「escape関数・unescape関数実験ツール」のようなものを作成してしまえば、簡単に元の文字列にデコードできてしまいます。 一つの防御策としては、「専用ソフトで暗号化する」の項目で紹介するような暗号化システムのようにdecode関数自体をescapeしてしまって、容易には解読できないようにすることです。これにより、「document.write」という言葉がすぐには見つけられないので、諦める人も出てくるだろうからです。しかし、これでもescapeしている部分をそのまま出していれば、見破られやすくなります。 では、どうすれば良いのでしょうか? こうなったら(encodeされた)decode関数及び、decode関数でデコードさせる対象の文字列を隠すしかありません。どこにどうやって隠すのか? 次に、外部ファイルによって隠す方法を検証していきましょう。
連絡先:info@broadband-xp.com (免責事項)このホームページの内容に起因する如何なるトラブルに対しても責任を持ちえません。必ず自己責任でご利用ください。 |