web-dev-qa-db-ja.com

IPアドレスに基づいて書き換えられたURIへのアクセスを制限する

特定のIPアドレスからDrupal 7登録ページ(/ user/register)へのアクセスを制限したい。

Apacheディレクティブを設定しようとしましたが、指定されていないIPからまだアクセスできます。

ここに私のバーチャルホストディレクティブのスニペットがあります

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName ######
    ServerAlias ######
    ErrorLog logs/######-error_log
    CustomLog logs/######-access_log combined

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://######%{REQUEST_URI}?%{QUERY_STRING} [R=301,L]

    <Location /user/register>
        Order deny,allow
        Deny from all
        Allow from ***.***.***.***
    </Location>

</VirtualHost>
3
BeardedGeek

すべての要求をHTTPS(デフォルトではポート443)にリダイレクトしていますが、<Location>ディレクティブは<VirtualHost *:80>コンテナー(ポート80-HTTP)にあります。

余談ですが、リソースを複数のURLでアクセスして制限を回避することが多いため、アクセス制限には<Location>ディレクティブをお勧めしません。 (たとえば、書き換えられたURLもブロックされていることを確認する必要があります。)

RewriteRule置換に?%{QUERY_STRING}も必要ありません。クエリ文字列はデフォルトで追加されます。

1
DocRoot

試してみることができるいくつかのことがありますが、最も簡単なものから始めます。

<VirtualHost *:443>
DocumentRoot /var/www/html
ServerName ######
ServerAlias ######
ErrorLog logs/######-error_log
CustomLog logs/######-access_log combined

<Location /user/register>
    Order deny,allow
    Deny from all
    Allow from ***.***.***.***
</Location>
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName ######
ServerAlias ######
ErrorLog logs/######-error_log
CustomLog logs/######-access_log combined

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://######%{REQUEST_URI}?%{QUERY_STRING} [R=301,L]

<Location /user/register>
    Order deny,allow
    Deny from all
    Allow from ***.***.***.***
</Location>

</VirtualHost>

基本的に、HTTPSの仮想ホストコンテナーにすべてをコピーして、HTTPとHTTPSの両方に設定が適用されるようにしました。

もう1つのオプションは、保護するドキュメントを提供するスクリプトの内容を変更して、受け入れられないIPアドレスからのアクセスをブロックすることです。

PHPの場合、<?phpの直下に次の行を追加できます。

If ($_SERVER['REMOTE_ADDR'] != "xxx.xxx.xxx.xxx"){echo "Access denied";exit();}

Xxx.xxx.xxx.xxxを、受け入れるIPアドレスに置き換えます。代わりに2つのIPアドレスが必要な場合は、次の行を追加できます。

If ($_SERVER['REMOTE_ADDR'] != "xxx.xxx.xxx.xxx" && $_SERVER['REMOTE_ADDR'] != "yyy.yyy.yyy.yyy"){echo "Access denied";exit();}
1
Mike