とうとう3まで書いてしまいました。
ここでは、コードを隠す上で少し注意が必要なことについて説明します。
基本的にはWindows Script Encoderで暗号化すると、解読の方法を知らない限りコードを読むのは難しいですが、場合によっては暗号化しても部分的にコードが読まれてしまうことがあるのです。
例えば次のような、暗号化されたJScriptのコードがあるページについて考えてみます。
<html>
<head>
<title>JScript Encoder Test</title>
<script language="JScript.Encode">
<!--
#@~^WAAAAA==W!x^DkKxPklbVWMWc#P@#@&7mV+MO`rサイコロの目P),E~_,HmY4RWsKW.`tCY4R.C NWhc*PMP+~3Pq*#p@#@&)@#@&0xUAAA==^#~@
//-->
</script>
</head>
<body>
<p><input type="button" value="サイコロを振る" onclick="saikoro()"></p>
</body>
</html>
見ただけでは何なのか分からないコードと、「サイコロを振る」ボタンがあり、このボタンをクリックすると、saikoro()が実行されることが分かります。
しかし、saikoro関数がどういうものなのか、コードが暗号化されていて分かりません。
実はこれには抜け穴があって、JScriptでalert(saikoro)というのを実行すれば中身が見えてしまうのです。
例えば、上記のソースのページにおいてInternet Explorerのアドレス欄に「javascript:alert(saikoro);」を貼り付けて[Enter]キーを押すと、次のようなメッセージが表示されます(もう少し改良して「javascript:void((window.open()).document.write("<pre>"+(""+saikoro).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")+"</pre>"));」とすることもできます)。
function saikoro(){
alert("サイコロの目 : " + Math.floor(Math.random() * 6 + 1));
}
見事に暗号化していたコードが丸見えになってしまいました。
いくら暗号化していても、イベントハンドラなどから関数名(ここではsaikoro)が分かると、関数の内容までばれてしまい、注意が必要です。
対策法の一つには、Windows Script Encoderの使い方2で説明した、saikoro()の部分を暗号化し、「onclick="if(window.execScript)execScript('暗号化されたコード','JScript.Encode');"」のように記述する方法があります。
つまり、「saikoro()」とだけ記述したJSファイルを作成し、これをScript Encoderで暗号化。作成されたコードをそのまま貼り付けるということです。
ただしこの方法ではコードが長くなりがちです。あらかじめ次のような関数を用意し、「onclick="JSEnc('暗号化されたコード');"」のように記述するのがいいかもしれません。
<script type="text/javascript">
<--
function JSEnc(enc){
if(window.execScript) execScript(enc, "JScript.Encode");
}
//-->
</script">