JavaScript難読化処理
|
6.URLエンコードを利用する5-1のソースを元に、更なる難読化の方法を考えてみたいと思います。URLエンコードを利用すると、すべての文字が「%82」など「%」と英数字・アンダーバーなどになります。これを元に戻すには、unescapeメソッドでデコードするだけですから、それほど難しいわけではありませんが、初心者・中級者に猫だましのごとく効果的です。例を出して考えてみましょう。非常に単純なJavascript「if(a>5){alert("abc");}」という文字列をescapeしてみます。下記のフォームにコピー&ペーストしてみてください。 「if%28a%3E5%29%7Balert%28%22abc%22%29%3B%7D」になりましたね。もちろん、このまま、元のソースと差し替えても動きません。「unescape("if%28a%3E5%29%7Balert%28%22abc%22%29%3B%7D");」とします。しかし、これでも動きません。この文字列をJavaScriptとして評価するには、evalメソッドを使用する必要があります。「eval(unescape("if%28a%3E5%29%7Balert%28%22abc%22%29%3B%7D"));」で動きます。即ち、非常に単純なJavascript「if(a>5){alert("abc");}」は「eval(unescape("if%28a%3E5%29%7Balert%28%22abc%22%29%3B%7D"));」に書き換えることが可能なのです。 ただ、ここまで読んできて疑問に思われた方もおられるかもしれません。escapeメソッドですと、日本語をエンコードした際に、ブラウザによって結果が変わってしまうことは、比較的よく知られた問題です。たとえば、「あいうえお」をescapeメソッドでエンコードしますと、IE6やFirefox 1.5.0.7では「%u3042%u3044%u3046%u3048%u304A」になりますが、Netscape 7.1では「%82%A0%82%A2%82%A4%82%A6%82%A8」になります。Netscape 7.1の方が文字通りのURLエンコード(このページは、Shift_JISのページなので、%82%A0・・・となっています。)であり、IE6やFirefoxのそれはunicodeベースのものであり、異なります。 IE6やFirefox 1.5.0.7でも、もちろんencodeURIメソッドで、いわゆるURLエンコードは可能ですが、これはIE5.5以上となっています。IE5.0や5.01(Windows)や、Mac版IEでは対応していません。また、ページ本体の文字コードにかかわらず、UTF-8でURLエンコードしてしまいます。 ですから、日本語が混じるとescapeメソッドは困ったことになります。しかし、逆にいえば、英数字だけなら問題が発生しません。 私たちは、既に、「日本語メッセージを英数字だけの文字列に変換する」の章で英数字だけのJavaScriptにすることに成功しています。ですから問題がありません。ソース5-1を元にescapeメソッドでエンコードし、それをunescapeとevalで動くようにしてみましょう。その結果が下記です。 どうですか? この難読化したソースを実際に外部ファイル化して、下記の入力フォーム・サンプルで入力チェックができるようにしています。難読化しても問題なく動作することを確認してください。
ただ、問題なのは、初心者・中級者を騙せても、上級者には通用しません。よく見ると、「charCodeAt」や「length」「return」「false」などはそのままです。これさえも消し去る方法を考えてみます。escapeメソッドでエンコードする前に、もう少し複雑にする方法を次のページでは考えてみます。いよいよ暗号化の領域に入っていきます。 目次: |