1

クライアントの開発サイトで作業しているため、そこからのすべてのアクセスを拒否したいのですが、会議や在宅勤務 (動的 IP) でオフィスにいないときは簡単にホワイトリストに登録できるようにします。

私たちが実現したいのは、あなたの IP アドレスを htaccess ファイルに書き込み、その上に、これが誰であるか、誰が許可したかなどを示すコメントを書き込むフォームを用意することです。

多くの詳細に踏み込まずに、私たちの場合、単純なパスワードは機能しません。リクエストの電子メール アカウントを人々に監視させたり、クライアントに独自の IP アドレスを取得させたり、このようなことはうまくいきません。

htaccess に追加されたこれらの IP アドレスの有効期限が切れるのを許可するとよいでしょう。だから、そのような複雑なロジックは htaccess 自体では飛ばないので、他のアイデアがない限り、サードパーティのソフトウェアで管理する必要があると思いますか?

4

1 に答える 1

5

Apache の RewriteMap ディレクティブを使用することをお勧めします。RewriteMap ディレクティブを使用するには、ディレクティブを .htaccess ファイルではなく httpd.conf に配置する必要があることに注意してください。いくつかの簡単な方法で使用できます。

プレーンテキストファイル

プレーン テキスト バージョンでは、IP アドレスを保持する .txt ファイルを使用できます。コメント用の行を追加しました。この方法では、自動期限切れは許可されません。

httpd.conf

RewriteEngine on
RewriteMap ipmap txt:/path/to/whitelist.txt

RewriteCond ${ipmap:%{REMOTE_ADDR}} !^allow$ [NC]
RewriteRule .* - [F,L]

whitelist.txt

# Chris London added this 2013/06/14
127.0.0.1 allow
123.45.67.89 allow # Some other comment

カスタムプログラム

RewriteMap を使用すると、実際に外部プログラムを実行させることができますが、これにはいくつかの注意事項があります。個人的には、特に PHP スクリプトでこの方法を使用したことはありません。PHP スクリプトで動作させるには、stdin の読み取りと stdout への書き込みを無期限に実行する必要があると思います。

RewriteEngine on
RewriteLock /path/to/rewrite.lock
Rewritemap ipmap prg:/path/to/executable.php

RewriteCond ${ipmap:%{REMOTE_ADDR}} !^allow$ [NC]
RewriteRule .* - [F,L]

実行可能.php

#!/usr/bin/php
<?php

$in = fopen('php://stdin', 'r');
$out = fopen('php://stdout', 'r');

while ($ip = fgets($f)) {
    // TODO add better logic
    if ($ip == '127.0.0.1') {
        fwrite(out, 'allow');
    } else {
        fwrite(out, 'deny');
    }
}

fclose($f);
  • 書き換えマップ プログラムはできるだけ単純にしてください。プログラムがハングすると、httpd はマップからの応答を無期限に待機し、その結果、httpd は要求への応答を停止します。
  • プログラムでバッファリングをオフにしてください。バッファリングされた I/O により、httpd が出力を待機するため、ハングします。
  • サーバーの起動時に開始されるプログラムのコピーは 1 つしかないことに注意してください。すべてのリクエストは、この 1 つのボトルネックを通過する必要があります。多くのリクエストがこのプロセスを通過する必要がある場合、またはスクリプト自体が非常に遅い場合、これにより大幅な速度低下が発生する可能性があります。

DB クエリ

これもまだ使っていませんが、かなり綺麗です。これを機能させるには、適切なデータベースを指すように mod_dbd を構成する必要があります。IP アドレスを取得する SQL ステートメントがあり、有効期限のフィルターを追加できます。

RewriteEngine on
RewriteMap ipmap "dbd:SELECT ipaddress FROM rewrite WHERE expiration < TIME() and ipaddress = %s"

RewriteCond ${ipmap:%{REMOTE_ADDR}} !^%{REMOTE_ADDR}$ [NC]
RewriteRule .* - [F,L]

他にもいくつかのタイプがありますが、これらはあなたに最適なようです. 前に言ったように、カスタム プログラムや DB クエリを使用したことがないので、何か間違ったことを言っている可能性があります。ここにいる別のユーザーが私の間違いに気付くかもしれないので、これらすべてがうまくいくことを願っています。

于 2013-06-14T13:48:33.767 に答える