Динамический белый список с htaccess, позволяющий форме добавить IP-адрес в белый список?

Работая над сайтом dev для клиента, мы хотим отказать ему в доступе, но разрешить легкий белый список, когда он не работает для встреч или работает из дома (динамический ip).

То, что мы хотим, имеет форму, которая записывает ваш IP-адрес в файл htaccess вместе с комментарием над ним, в котором указывается, кто это или кто его санкционировал.

Не вдаваясь в кучу деталей, простой пароль не будет работать в нашем случае, если люди будут отслеживать учетные записи электронной почты для запросов, если клиенты получат свои собственные IP-адреса, такие вещи просто не летают.

Что было бы неплохо, это позволяет этим добавленным IP-адресам в htaccess истекать. Поэтому я считаю, что сложная логика вроде бы не летает в htaccess, поэтому ей нужно будет управлять сторонним программным обеспечением, если у кого-нибудь нет других идей?

Я рекомендую использовать директиву Apache RewriteMap. Обратите внимание, что для использования директивы RewriteMap вы должны поместить директиву в httpd.conf и NOT .htaccess. Вы можете использовать его несколькими простыми способами.

Обычный текстовый файл

Версия простого текста позволяет вам иметь .txt-файл, содержащий IP-адреса. Я добавил строку для комментария. Этот способ не позволяет автоматически истекать.

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] 

executable.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 перестанет отвечать на запросы.
  • Обязательно отключите буферизацию в своей программе. Буферизованный ввод-вывод заставит httpd ждать выхода, и поэтому он будет висеть.
  • Помните, что есть только одна копия программы, начатая при запуске сервера. Все запросы должны пройти через это узкое место. Это может привести к значительным замедлениям, если многие запросы должны пройти этот процесс или если сам сценарий очень медленный.

Запрос БД

Я еще не использовал этот, но он выглядит довольно аккуратно. mod_dbd необходимо настроить для указания правильной базы данных, чтобы это работало. У вас есть оператор SQL, который извлекает IP-адреса, и вы можете добавить фильтр для даты истечения срока действия.

 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] 

Есть пара других типов, но они кажутся вам наиболее подходящими. Как я уже говорил, я раньше не использовал пользовательскую программу или запрос БД, поэтому я, возможно, сказал что-то не так. Надеюсь, другой пользователь здесь может поймать мою ошибку, чтобы все это сработало для вас.