▼▽ Instant Access Menu ▽▼

 Javascriptのescape関数で判読を難しくする   



安心の電話によるサポート!!
WADAXレンタルサーバー

 待望のHTML暗号化ソフト誕生!! 
株式会社プランセスの全面協力の元、HTML暗号化ソフト「SHTML」を2005年7月11日にリリースしました。

Javascriptの知識が全くない方でも利用可能なように設計されています。最短ステップの場合、暗号化したいソースを貼り付けて、「暗号化する」ボタンをクリックするだけです!!

右クリック禁止+ソースの暗号化+印刷禁止+テキスト選択禁止・・・が今までにないほど簡単に!!
(サンプル):
オリジナル: 株式会社プランセスのメインページ

暗号化したページ: こちら


Javascriptのescape関数を用いると、日本語などそのままURLに渡すと問題が起こる可能性のある文字をエンコードしてくれます。IEでは、ユニコードにエンコードしてくれます。例えば、「あ」という文字はIEでは「%u3042」と「%u」で始まる文字列にエンコードしてくれます。

一方、Netscapeでは、escape関数を用いると文字列をISO-Latin-1コード(ASCIIコード)に変換してくれます。例えば、「あ」という文字は、「%82%A0」というふうに変換してくれます。2バイト文字は1バイト(8ビット)ずつ、16進数に変換しています。

このesacpe関数と対になっているのがunescape関数です。unescape関数は、エンコードされた文字列をデコードし、元の文字に戻す機能があります。この2つの関数(escape、unescape)を用いて、HTMLソースコードの解読を難しくさせることが可能です。例えば、

<script language="JavaScript">
<!--
document.write(unescape("%3Cb%3E%u3042%u3044%u3046%u3048%u304A%3C/b%3E"));
//-->
</script>

と書けば、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関数と同様の変換をネットスケープでも行ってくれる関数)を作成することも可能でしょう。

<script language="JavaScript">
<!--
	//ネットスケープでもIEのescape関数と同じようにunicodeに変換する関数
	function getunicode(str){
		var moji;
		var uni = "";
		for( var i=0;i<str.length;i++){
			moji = str.charCodeAt(i);
			if(moji <= 255){ //ascii文字
				if(moji <=15){
					//CRLF(改行コード)・tabなど。CRなら「0D」と返ってくると
					//思いきや「d」が返ってくる
					uni = uni + "%0" + moji.toString(16);
				} else if(moji >=48 && moji <=57){ //半角数字
					//そのまま表示
					uni = uni + str.charAt(i);
				} else if(moji >=65 && moji <=90){ //アルファベット大文字
					//そのまま表示
					uni = uni + str.charAt(i);
				} else if(moji >=97 && moji <=122){ //アルファベット小文字
					//そのまま表示
					uni = uni + str.charAt(i);
				} else {
					//「<」「>」「&」などは変換
					uni = uni + "%" + moji.toString(16);
				}
			} else {
				//16進数に変換
				uni = uni + "%u" + moji.toString(16);
			}
		}
		return uni;
	}
//-->
</script>

ただ、更に重大な問題があります。decode関数を使えば、ブラウザは作成者の意図したとおりにユニコード形式の文字列を人間が読める文字に変換して表示してくれているのですから、人間だって、decode関数でデコードさせている対象の文字列及び、decode関数のソースさえ分かれば、簡単にHTMLソース全体を読むことができるようになってしまいます(ここで注目すべきは、通常の文字列をどのようにエンコードしているかを知る必要は全くないということです。)。ちょうど、上にある簡単な「escape関数・unescape関数実験ツール」のようなものを作成してしまえば、簡単に元の文字列にデコードできてしまいます。

一つの防御策としては、「専用ソフトで暗号化する」の項目で紹介するような暗号化システムのようにdecode関数自体をescapeしてしまって、容易には解読できないようにすることです。これにより、「document.write」という言葉がすぐには見つけられないので、諦める人も出てくるだろうからです。しかし、これでもescapeしている部分をそのまま出していれば、見破られやすくなります。

では、どうすれば良いのでしょうか? こうなったら(encodeされた)decode関数及び、decode関数でデコードさせる対象の文字列を隠すしかありません。どこにどうやって隠すのか? 次に、外部ファイルによって隠す方法を検証していきましょう。

Back ← |  |  |  |  |  |  | |  | 10 | 11 | 12 |13 | → Next


連絡先:info@broadband-xp.com
(免責事項)このホームページの内容に起因する如何なるトラブルに対しても責任を持ちえません。必ず自己責任でご利用ください。