■CGIが作成するxxx.datやxxx.logといったログファイルをブラウザで直接指定すると中身が見えてしまう。


[原 因]

ユーザディレクトリ配下にフリーで配布されているCGIを置くと発生する問題で、見られて困る場合は対処が必要である。/cgi-bin/ディレクトリ配下にCGIを置いた場合は、ログファイルに直接アクセスすると全てのファイルがcgiとして実行されるので、CGIではないxxx.datやxxx.logといったファイルは、「500 Internal Server Error」となり中身を見ることはできない。(逆に、htmlや画像を含むCGIを/cgi-bin/配下に設置すると、表示できないという問題も発生する。)


[対 処]

対処方法としては、以下のような方法があるが、それぞれ使える環境や効果が異なるので各自の環境でベストと思われる方法を採用すればよい。
あまりスマートではないが、簡易なのは5項である。おやじは4項を採用している。

  1. 一番確実なのは、このようなログファイルはブラウザで直接アクセスできないディレクトリに置くことにし、CGIの設定もそれにあわせて変更する方法である。おやじが自分で作成しているCGIは全てこの方法である。但し、CGIによっては、デフォルトでログファイルを用意しておかないと駄目なものもあり、この場合は管理者が介在しないと設置できないのでやや面倒である。

  2. 上記の変形であるが、通常、これらのログファイルはCGIと同一ディレクトリ配下に作成されるが、別途、ログファイルを作成するフォルダを作成し、必要なら初期ログファイルはその中に移動し、CGIの設定もそれにあわせて変更する方法である。フォルダ名を工夫するだけでアクセスは困難になるが、更に確実にするには、ログファイルフォルダに.htaccessでアクセス規制を行うと良い。ログファイルフォルダはユーザがアクセスできる位置でかまわないので、管理者が介在しなくても設置が可能である。.htaccessファイルの内容は、下記のとおり書けばよい。
    ブラウザで直接アクセスすると、「403 Forbidden」となるので、ファイルがあることはわかってしまう。

    Order allow,deny
    Deny from all

    特定のネットワーク(家庭内等)からはアクセスを許容したいなら、下記のようにすればよい。下記は192.168.0.0/24からのアクセスを許容する例である。

    Order deny,allow
    Deny from all
    Allow from 192.168.0.0/24

  3. 1項や2項は、フォルダの作成やCGIの設定変更等が必要であり面倒だというなら、「.dat」や「.log」への直接アクセスを規制してしまう方法がある。( .htxxxファイルへのアクセス規制と同じ) httpd.confに下記のように追加すればよい。なお、ブラウザで直接アクセスすると、「403 Forbidden」となるので、ファイルがあることはわかってしまう。

    <Files ~ "\.(dat|log)$">
        Order allow,deny
        Deny from all
    </Files>

    ログファイルとしてdatやlog以外の拡張子がある場合は、1行目の(  )内の dat|log に続けて dat|log|xxx のように追記すればよい。
    特定のネットワーク(家庭内等)からはアクセスを許容したいなら、下記のようにすればよい。下記は192.168.0.0/24からのアクセスを許容する例である。

    <Files ~ "\.(dat|log)$">
        Order deny,allow
        Deny from all
        Allow from 192.168.0.0/24
    </Files>

  4. rewriteが使用できるなら、「.dat」や「.log」に直接アクセスされたら、「404 Not Found」にリダイレクトしてしまう方法がある。httpd.confに下記のように追加すればよい。
    なお、sslを動かしているなら、全く同じ内容をssl.confのVirtualHostディレクティブ内に追記する。この設定をしないとsslでは見えてしまう。

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteLog logs/rewrite.log  (Linuxならrewrite_log)
        RewriteLogLevel 1
        RewriteCond %{REQUEST_URI} "\.(
    dat|log)$" [NC]
        RewriteRule /.* /error/HTTP_NOT_FOUND.html.var
    </IfModule>

    ログファイルとしてdatやlog以外の拡張子がある場合は、5行目の(  )内の dat|log に続けて dat|log|xxx のように追記すればよい。
    特定のネットワーク(家庭内等)からはアクセスを許容したいなら、5行目の前に下記を追加すればよい。下記は192.168.0.0/24からのアクセスを許容する例である。

        RewriteCond %{REMOTE_ADDR} !^192\.168\.0\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$

    Rewitelog関係は、loglevel 1でもかなりのログが出るので不要なら設定しないか、テスト終了後にRewriteloglevel 0とすればよい。
    この方法なら、ブラウザで直接アクセスすると、「404  Not Found」となるのでファイルがあることはわからない。

  5. あまりスマートではないが、拡張子が限定できるなら/cgi-bin/ディレクトリに置いたのと同様に、直接アクセスされたらcgiとして動作させ、結果として、「500 Internal Server Error」となり中身を見せなくする方法であるが、ファイルの存在はわかってしまう。設定方法は、httpd.confのCGIファイル拡張子の定義で、「.pl」に加え「.dat」や「.log」をcgiとして定義するだけであり、CGIを触る必要がないので非常に簡便である。ログファイルとしてdatやlog以外の拡張子がある場合は、同様に追記すればよい。

    #AddHandler cgi-script .cgi

           ↓削除、追加

    AddHandler cgi-script .cgi .pl .dat .log



Top Pageへ     戻る