Active Server において、ソースが見えてしまうバグに対するひとつの答え



状況
Active Server のソースが見えてしまうというバグは、ご存知の事だと思う。
ファイル名の後に続けて、":$$DATA" と入れて、「ブラウザのソースを見る」で見てみると、ソースが見えてしまうというものである。
ASP のソースが、ユーザーに見えてしまうという事は、ASP のソースにじかに、データベース名や、接続パスワードなどを記述してしまった場合、データベースサーバーは、非常に危険な状態に置かれることになる。
「イントラネットのウェブサーバー&データベースサーバーだから、大丈夫」と思っているASP開発者の方々!...
驚くなかれ!....ハッキングや、クラッキングの半分以上は、社内犯罪である(このあたりは、いろろいな調査会社や、FBI の報告を参考にしている)ことに留意してもらいたい。

つまり、
「セキュリティは、ファイアウォールに任せて、自分たちの作るASPアプリケーションには関係ないのさ」とはいかないのである。

さて、上述のバグについてですが、HotFix や、ServicePack を当てればいい。という対処法が思いつくと思います。
この考えは、正しいとは思います。
....しかし、これだけで大丈夫でしょうか?

実際、この対応(HotFix や、ServicePack を当てる事)は、必要だと言えるし、非常に有効な対処法だと自分でも考えます。

もう少し、考えてみて、別の手段を模索してみます。
ASP ファイルに対してのバグなのだから、global.asa にパスワードなどの機密情報を記述して、ASP は、それをApplication 変数(Application オブジェクト)を介してASPは、利用すればいい。
という対処法はどうでしょうか?

自分は、原則的にこの考えであります。
しかし、global.asa に対しても、上述のバグは、有効なのです。
"http://....../global.asa:$$DATA" としたところ、global.asa のソースが漏れてしまうのです。

うーーん、どうしよう。という事になります

この方向性は、間違っていたのでしょうか?
そこで、さらに一歩進めます。

global.asa にも書かなければいいではないか。と...

つまり、global.asa から、別のファイル(設定情報{機密情報}だけ記述されたファイル)を読み込めばいいではないか。と!......(びっくりマーク付けちゃう)

しかし、global.asa からは、Request オブジェクトなど、有効なオブジェクトを読み出すことができません。
(global.asa 内の、Application_OnStart 関数からは、いろいろと利用できるオブジェクトに制限があります。{詳しくは、ASP のヘルプを参照}
それじゃ、各 ASP ファイルから、毎回読み出せばいいという事になりますが、それは、プログラムの開発工程に"煩雑さ"を与えると思います。
つまり、グローバル変数でなければいけない値をローカル変数にする事の弊害です)

そこで、作ったプログラムが、本プログラムであります。
本プログラムは、VisualBASIC6.0 で作成されていますので、例のごとく、対応するバージョンのランタイム・ライブラリ等をどこかから入手してください。
本プログラムは、COM コンポーネントになっており(DLL 形式)、本プログラムを利用することで、簡単に、Application_OnStart 関数などから設定ファイルを読み出すことが可能です。
自分の作成した、チャットプログラムでも使用しています。
ソースも付属しているので、(VisualBASIC6.0)十分納得した上で、利用する事も可能です。

使用方法
例えば、以下のようなディレクトリ構成にします。

このようにすれば、
機密情報などの記述されている設定ファイルは、HTTP プロトコルを利用して、リモートからアクセスできないわけです。
そして、設定ファイルに記述されている機密情報などの情報は、global.asa が、本プログラムを介して、Application変数(Application オブジェクト)へ読み込まれます。
(各、ASP ファイルが、本プログラムを介して、読み出してもいいのでしょうが、ファイルの読み出し(遅いディスクアクセス)を何度もやらない方がいいのではないでしょうか?
この辺は、詳しくないので、詳しい方!...メールください...m(_ _)m)

global.asa の書き方の具体例
まず、設定ファイルを、以下のような書式で記述します。

----------config.ini (設定ファイル)---------------
パスワード
password=abcdefghijk
    
----------config.ini (設定ファイル)---------------
(一行に、名前=値 と記述します。)

global.asa の書き方の具体例
----------global.asa -(VBScript)------------------
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
 Sub Application_OnStart
  Dim ConfigFile
  Dim obj
  ConfigFile = "..\config.ini"
  Set obj = Server.CreateObject("get_path.get_path_class")
  ConfigFile = obj.get_path_func() & ConfigFile
  Application("password") = obj.ReadFile(ConfigFile,"password")
  Set obj = Nothing
 Sub End
</SCRIPT>
    
----------global.asa -----------------------------
{get_path_func() というメソッドは、本プログラムのメソッドの一つで、ASP(asa)ファイルの絶対パスを返します(最後の文字は必ず"\"です)。
ReadFile(ファイル名、引数)は、、指定したファイル(絶対パス)から、引数で始まる行を探し出し、その"="の右側を返すメソッドです}


とする事で、アプリケーション変数{Application("password")}に、パスワード "abcdefghijk" が格納されます。

この欠点は、設定ファイルを更新(値の変更)をしても、それだけでは、反映されない点です。
反映させるには、ASP の再起動が必要になります。(つまり、global.asa の上書き)
面倒ならば、Application_OnStart 関数から、Session_OnStart 関数にする事をお勧めします。(とする事で、次のセッションから有効になります。
でも、セッションの発生ごとに読みに行くの?...)


利点は、上述のセキュリティの面で強化される事と、ASP と、何かローカルアプリケーション(例えば、Windows Scripting Host)との設定ファイルの共有・統合が可能となります。

使い方
VisualBASIC6.0 用のランタイムをどこかから(ex:Vector)ダウンロードしてインストールしておきます。
(既に、VisualBASIC6.0 がインストールされていればそれで十分です)

ダウンロードしたファイルを解凍しします。
(LHAは、吉崎栄泰氏が、著作権を所有)

解凍して出来たディレクトリのうち、"vb6" は、VisualBASIC6.0 用です。
あとは、VB6 のどちらか(各自の環境に合わせて)の Get_Path.dll を適切な(お好きな)ディレクトリへコピーします。
そして、Get_Path.dll を RegSvr32.exe を利用して、レジストリに登録します。
または、ダウンロードして出来たディレクトリにある RegSvr.bat を、Get_Path.dll と同じディレクトリへコピーして、RegSvr.bat を実行してもいいです。
最後に、Get_Path.dll 自体に、適切なアクセス権を設定します。

ファイル内容
ファイル内容は、VisualBasic 6.0 用のソースと、コンパイル済みDLLファイルです。
別途、VisualBASIC6.0 ランタイムが必要です。
その、DLL を、"regsvr32.exe" プログラムで、レジストリに登録すれば、利用できるようになります。

拙者作の 「ASP でチャット」 にてこれを利用しています。

ダウンロード
get_path.lzh(FileSize = 14,935byte) (get_path.lzh.base64)
履歴
  • 取得する環境変数を PATH_TRANSLATED から、APPL_PHYSICAL_PATH に変更したので、get_path_func() は、Global.asa のあるディレクトリパスを戻す事になる
    (2001/10/25)
  • VB5.0 のバイナリを削除
    (2001/10/25)
mail to active@window.goukaku.com