Misc. Notes

[インデックスに戻る]

アクセス制限

ファイルへのアクセス制限やパスワードを掛けたりできます。

目次


ファイルへのアクセスを制限/禁止する

ディレクトリやファイルに対して色々な基準でアクセスを禁止することができます。(Apache 1.2以降)

対象とするファイルの指定

まずアクセス制限したいファイルをFilesで指定します。省略した場合は全てのファイルが対象になります。

<Files ファイル名> ... </Files>

<Files ~ 正規表現> ... </Files>
<FilesMatch 正規表現> ... </FilesMatch> (Apache 1.3以降ではこちらを推奨)

この中に制限についての記述をすることになります。ファイル名にはワイルドカードとして?と*が使えます。正規表現も使用可能です。

<Files my-*>
    my-で始まるファイルに対して制限
</Files>

<FilesMatch "\.s?html?$">
    HTMLファイルに対して制限
</FilesMatch>

<Files *>
    すべてのファイルに対して制限(Filesで囲まなくても同じ)
</Files>
比較対象のファイル名はリクエストしたURLのパスの最後のセグメントになるようだった(Apache 1.3.17で確認)ので、Content Negotiationを使っている場合に、拡張子による制限をする時は注意が必要です。

アクセスの許可・禁止

allow from ホスト
deny from ホスト

ホストはスペース区切りで列挙可能で、以下の値を使用できます。

all
すべて
ドメイン名
ホスト名がドメイン名と同じか、またはそれで終わるもの
IP (x.x.x.x)
IPアドレスが同じ
IP (x.x.x)
IPアドレスの頭3オクテットが同じ
IP+マスク (x.x.x.x/x.x.x.x)
マスクしたIPアドレス (Apache 1.3以降)
env=環境変数名
環境変数が定義されている場合 (Apache 1.2以降)

IPアドレスの頭3オクテット(24bit分)で制限する場合、"x.x.x."と最後に"."を付けなくてはならないという説明をたまに見掛けますが、別に付けないでも構いません。ちゃんと"1.2.3"で"1.2.3.45"はマッチしますし、"1.2.34.5"はマッチしません(ドットの位置に注目)。ホスト名についても同様で、頭に"."を付けないで、"hoge.ne.jp"と指定しても"proxy.hoge.ne.jp"にマッチしますし、"hogehoge.ne.jp"にはマッチしません。但し、"."を頭につけて".hoge.ne.jp"と指定した時に、"hoge.ne.jp"にはマッチしなくなります。

環境変数によるチェックBrowserMatch,SetEnvIf等と組み合わせて使用します。これについては後述します。

allow from jp
    ホスト名がjpで終わる(おそらく)日本からのアクセスのみ許可
deny from 192.168.0
    ホストのIPが192.168.0.*の場合不許可
allow from 10.0.0.0/255.0.0.0
    ホストのIPが10.*.*.*の場合許可
allow from 172.16.0.0/12
    ホストのIPが172.16.*.*〜172.31.*.*の範囲の場合許可

<Files .htaccess>
    order deny,allow
    deny from all
</Files>           .htaccessへのアクセスを禁止する

許可・禁止の評価順序

allowdenyを評価する順序を指定します。

order 順序

順序は以下の値を指定します。各行の評価でマッチした場合、allowならばアクセス許可、denyならばアクセス不許可の状態になり、残りの評価を続けます。

deny,allow
denyをチェックした後に、allowをチェックします。初期状態はアクセス許可です。
つまりdenyにマッチしてしまい、なおかつallowにマッチしない場合アクセスは許可されません。
よくある使い方としては大雑把に(又は全てを)denyにした後、その中からアクセス許可するものをallowで定義します。
allow,deny
deny,allowの丁度逆でallowをチェックした後に、denyをチェックします。初期状態はアクセス不許可です。
つまりallowにマッチして、なおかつdenyにマッチしなければアクセスは許可されます。
mutual-failure
allowにマッチしてdenyにマッチしないものだけがアクセスを許可されます。この場合初期状態は関係なくなります。ただ、mutual-failureはallow,denyに置き換えても意味が変わらないのでmutual-failureを指定する必要はないでしょう。NCSA httpdとの互換性のために用意されたとかされないとか (^^;

どの順序を指定した場合でも全てのallow,denyの行は評価されます。また、上の説明で分かると思いますが、orderは複数の種類を定義しても意味がありません(意味が通りません)。私がテストした環境では複数書いてもエラーにはならずに最後に書いたorderが有効になるようでした。何も書かないとorder deny,allowとなるはずですが、書いたほうが後で見たときに解りやすいでしょう。

実際の例

例えば、次の様な定義がされていたとします。普通は読みやすいようにもっと綺麗な順番で書きますが (^^; 、どのような順で書いても意味は変わりません。

deny from com
order deny,allow
allow from jp kr
deny from 1.0.0.0/8

ケース1:ホストproxy.hoge.ne.jp (1.2.3.4)がアクセスしてきた場合

  1. order:deny,allow (初期状態:許可)
  2. deny:1.0.0.0/8 comのどれか →1.0.0.0/8にマッチする (現在の状態:不許可)
  3. allow:jp krのどれか →jpにマッチする (現在の状態:許可)
  4. →アクセスは許可される

ケース2:ホストproxy.foo.com (2.4.8.16)がアクセスしてきた場合

  1. order:deny,allow (初期状態:許可)
  2. deny:1.0.0.0/8 comのどれか →comにマッチする (現在の状態:不許可)
  3. allow:jp krのどれか (現在の状態:不許可)
  4. →アクセスは許可されない

ケース3:ホストproxy.hoge.jp (3,6,9,12)がアクセスしてきた場合

  1. order:deny,allow (初期状態:許可)
  2. deny:1.0.0.0/8 comのどれか (現在の状態:許可)
  3. ( allow:jp krのどれか →jpにマッチする (現在の状態:許可) )
  4. →アクセスは許可される

すべてのorderについて書くわけにはいかないですが、大体分かるのではないかと思います。

制限によって要求がブロックされた場合は403 Forbiddenエラーになります。

特定のリクエストメソッドに制限を掛ける

例えば掲示板を読むのは制限しないが書き込みは制限を掛ける、というようなことが可能です。

<Limit メソッド [メソッド [...]]> ... </Limit>
<LimitExcept メソッド [メソッド [...]]> ... </LimitExcept> (Apache 1.3.5以降)

Limitではメソッドに記述されたメソッドについてアクセスが制限されます。LimitExceptは逆に記述したもの以外全てを対象とします。メソッドは例えば以下のものがあります。また、必ず大文字で書いてください。

GET, HEAD, POST
GETを指定するとHEADも自動的に制限されます。HTTPの話になるので解説は割愛します。
PUT, DELETE, CONNECT
通常使用しませんし、既に制限されています。
OPTIONS, TRACE
制限しても特に意味がないと思われます (^^;
<Limit POST>        日記CGIへの書き込みはホストme.exampleに限定
    <Files diary.cgi>
        order deny,allow
        deny from all
        allow from me.example
    </Files>
</Limit>

Limitによって制限されたメソッドを要求すると405 Method Not Allowedエラーになります。

環境変数を使った複雑なアクセス制限

特定の環境変数が条件を満たす場合に別の環境変数を定義することができます。Filesと組み合わせる事で例えばリファラ(Referer)による制限を掛けるということが可能になります。CGIを使って行っている例はよく見掛けますが、.htaccessでも同じことが出来るわけです。

英単語的にはrefererは正しくはreferrerですが、RFC2616の14.36 Referer
The Referer[sic] request-header field allows ... (the "referrer", although the header field is misspelled.)
という記述がある通りで、(少なくともHTTP 1.1までは)Refererと書くことになっています。
SetEnvIf 環境変数名 正規表現 設定環境変数名[= [設定環境変数名[=...]]] (.htaccessでの使用はApache 1.3.13以降)

環境変数名正規表現にマッチする場合は、設定環境変数名に設定されます。が省略された場合、1がセットされます。大文字・小文字を区別しない場合はSetEnvIfNoCaseを使用します。

環境変数名がUser-Agentの場合、代わりにBrowserMatch(NoCase)が使用できます。

BrowserMatch 正規表現 設定環境変数名[= [設定環境変数名[=...]]] (.htaccessでの使用はApache 1.3.13以降)

BrowserMatchでは環境変数名の先頭に!を付けることでその環境変数を未定義にできます。 BrowserMatchNoCase ^Mozilla IsMozilla BrowserMatchNoCase compatible !IsMozilla SetEnvIfNoCase Referer "^(http://([^\.]+\.)?host\.example(:0*80)?(/|$)|$)" FromMyDomainHTTPorUnknown # 特定のファイルにだけ適用する制限の為の環境変数の場合、Filesセクションの中に記述したほうがいいと思います。 <Files *> order allow,deny allow from env=FromMyDomainHTTPorUnknown 条件に一致する場合のみアクセス許可 </Files>

[インデックスに戻る]

Validate [HTML | CSS]   Copyright © 1999-2002 Kentaro Sato. All rights reserved.