IE(インターネットエクスプローラ)を用いたアプリケーションで作成したスクリプトを安易に覗かれないようにするためにテキストをエンコードするソフトウエア、 Microsoft社の Windows Scripting Encoder を実際に使用してみました。マニュアルを読んでもさっぱりうまくいかず。四苦八苦したあげくようやく使えるようになった次第を書き留めたメモです。
会社の業務で業務日報作成システムを構築しています。このシステムは、各社員が自分のパソコンでその日の業務内容や営業情報等を所定の報告書様式で作成・保存しておき、インターネット接続時に一括して会社サーバーにデータ送信する、というもので、出張や外出が多い仕事柄、インターネット接続できない状況でも日報作成できるようにしてあります。すなわちローカルで使用することを前提にしています。
システムの構築ツールはブラウザ(IE6またはIE7)での使用を前提に下記を用いました。
ここで問題になるのは、クライアント側にインストールされるファイルのスクリプトのソースが丸見えになること。社員限定とはいえ、自由に改竄することができますし、設定値やサーバーアドレス等も丸見えなので、サーバーのセキュリティ面からも大いに不安です。そこで、Microsoft社の Windows Script Encoder を使用し、スクリプトをエンコードして簡単には読めないようにすることにしました。
実際に使用するにあたり、次のサイトで教えを乞いました。改めて御礼申し上げます。
ソフトをマイクロソフト社のホームページから無料でダウンロードすることができます。
上記のページには、【Windows Scripting Encoder】の摘要可能なOSとして Windows XP の記載がありません。もしかすると、このページで述べている種々の問題点はそのへんが原因なのかも知れませんが、一応、使用することはできるようです。
ダウンロードした自己解凍exeファイルを実行すると、標準では
[インストール先] C:\Program Files\Windows Script Encoder
にインストールされ、また、マニュアル「Windows Scripting Encoder ドキュメント」がスタートメニューに登録されます。以下、上記の状態にインストールされたものとして話を進めます。
【Windows Script Encoder】を用いてエンコードするファイルの構成は、Cドライブ直下で模擬的に下記のようになっているものとします。すなわちsampleフォルダにあるhtml/jsファイルをエンコードして新たにencodeフォルダにファイルを作成します。
ドライブ C: | ┌ sample(folder) | エンコード前のファイル保存フォルダ | |
│ ├─ | sample.html | エンコード前のhtmlファイル | |
│ └─ | sample1.js | htmlファイルで使用する外部jsファイル | |
└ encode(folder) | エンコードしたファイルの保存先フォルダ | ||
├─ | sample.html | エンコード後のhtmlファイル | |
└─ | sample1.js | エンコード後の外部jsファイル |
【Windows Script Encoder】によるファイルのエンコードは、コマンドプロンプトを用いて行います。なお、細かい説明はマニュアルを参照して下さい。
最初にsampleフォルダのsample1.jsをエンコードしてみます。
(コマンドプロンプトでエンコード実行)上記では、ファイル名を直接指定しないで、「sampleフォルダのすべてのjsファイルをエンコードしてencodeフォルダに新たにファイルを作成する」という指定にしています。jsファイルはjavascriptのファイルとして自動認識されるので、特にオプション設定は必要ありません。ファイル名を指定してエンコードされたファイル名を変更することが可能です。
jsファイルは下記のようにエンコードされました。
(エンコード前:sample/sample1.js) (エンコード後:encode/sample1.js)2バイト文字(日本語)はエンコードされません。
ここで注意しなければならないのは、「エンコードしたいのはjsファイルだけ」だとしても「jsファイルをエンコードしただけでは不十分だ」ということです。すなわち、このjsファイルを外部javascriptファイルとしてリンクしているhtmlファイルの方もエンコードしておかなけれはなりません。htmlファイルにスクリプトが書き込まれていずエンコードの必要がない場合でも、です。
故に、次に上記のjsファイルを外部javascriptファイルとしてリンクしているhtmlファイルをエンコードします。
(コマンドプロンプトでエンコード実行)上記も指定方法はjsファイルの場合と同様です。htmlファイルも自動認識されるのでオプション指定の必要はありません。
htmlファイルは下記のようにエンコードされました。
<script type="text/javascript">〜</script>
間がエンコードされている
<script type="text/javascript" src="...
が、自動的に
<script type="text/JScript.Encode" src="...
に変更されている
タグ内の言語指示子(というそうです)が「javascript→JScript.Encode」となっていますが、JScriptは使用していなくてもこのままで動きます。また、<!--及び//-->
もエンコードされていることに注意して下さい。<!--及び//-->
は記述しないでエンコードし、エンコード後に書き込んでもよいと思います。
エンコード前のsample.htmlを開く
エンコード後のsample.htmlを開く
vbscriptの場合は「vbscript→VBScript.Encode」となります。
ここまでの道のりは決して平坦ではなく、はっきり言えば何度「やめようか」と思ったかも知れないぐらい手間ひまかけました。その最大の原因はマニュアル(Windows Script Encoder ドキュメント)どおりでは動かないこと。Windows XPで動く保証がないヤツを使おう、というのだから当然と言えば当然なのではありますが。
マニュアルでは「エンコードを始める位置を識別するために、ソースコード内でマーカーを使用します。」としてjavascriptのサンプルソースを記載しています。
<SCRIPT LANGUAGE="JScript">
//Copyrightc 1998. ZYX Productions. All rights reserved.
//
**Start Encode**
// ここにコードを記述します。
</SCRIPT>
すなわち**Start Encode**
以降がエンコードされそれ以前はエンコードされないということですが、実際にやってみるとすべてがエンコードされてしまい、そのスクリプトを実行するとエラーになります。vbscriptの場合でも同様です。
マニュアル内にはjsファイルとvbsファイルは「エンコードすると、それぞれ .jse および .vbe に変わります」という記載がありますが、実際には変わりません。私の読みいかも知れませんが。ファイルの拡張子が変わったらhtmlやスクリプトに記述してあるファイル名もすべて変更する必要があるのかないのか。エンコードしたあとには変更できない、ということでなにやらヘンな感じではあります。
ファイルをサーバーにアップロードするする場合、元ファイルから一時的にエンコードしたファイルを作成しそれをFTPでアップロードするようにしています。実際にはエンコードを自動的に行うためvbscriptを用いて自動化していますが、コマンドプロンプトでのエンコードはbatファイルを実行するようにしています。batファイルの実際例を下記に記載します。
(エンコードを自動実行するためのバッチファイルの例:script_encode.bat)vbscriptで上記のバッチファイルを実行する例は下記の通りです。
(script_encode.batを実行するvbscriptの例)エンコード後「エンコードされたテキストを 1 文字でも変更すると、スクリプト全体の整合性が失われ、使用できなくなります」(Windows Script Encoder ドキュメント)。 エンコードされていないhtmlのタグ等の変更は可能です。
webに専門的な知識のあるひとならばツールを入手して簡単にデコードできます。そこまで手間暇かけてデコードする、というひとはそう沢山はいないはずですが。
前述しているように2バイト文字(日本語)はエンコードされません。ひとさまにみられたくないこと等をあからさまに書いたりしないようにしましょう。
エンコードするとき /f とオプション指定すると「入力ファイルに出力ファイルが上書き」されます。すなわち元ファイルが残りません。くれぐれもご注意下さい。サーバー等にアップロードするときは、本文中に記載されているようにアップロード用の一時ファイルを作った方がいいと思います。
私はテスキトエディタとしてTeraPadを使用していますが、エンコードされたファイルをTeraPadでオープンすると「Null文字を含むファイルです。Null文字は半角スペースに変換しました。」とメッセージされます。Windows標準のNotoPadでは問題ありません。TeraPadの設定で変わるかも知れませんが、特に試していません。