带有htaccess的动态白名单,允许表单为白名单添加IP?

时间:2013-06-14 12:14:25

标签: php .htaccess lamp

在客户端的开发站点上工作,我们希望拒绝来自它的所有访问,但允许在办公室外面或在家工作时轻松列入白名单(动态IP)。

我们想要发生的是,有一个表单,将您的IP地址写入htaccess文件以及上面的注释,说明这是谁或授权谁等。

在没有进入大量细节的情况下,一个简单的密码在我们的案例中不起作用,让人们监控电子邮件帐户的请求,让客户获得他们自己的IP地址,这样的事情就不会飞。

什么是好的,是允许htaccess中这些添加的IP地址过期。所以我认为复杂的逻辑就像在htaccess本身不会飞,所以它需要由第三方软件管理,除非有人有任何其他想法?

1 个答案:

答案 0 :(得分:5)

我建议使用Apache的RewriteMap指令。请注意,要使用RewriteMap指令,您必须将指令放在httpd.conf而不是.htaccess文件中。您可以通过几种简单的方式使用它。

纯文本文件

纯文本版本允许您拥有一个保存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]

<强> 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停止响应请求。
  • 务必关闭程序中的缓冲。缓冲I / O将导致httpd等待输出,因此它将挂起。
  • 请记住,只有一个程序副本,在服务器启动时启动。所有请求都需要经历这个瓶颈。如果许多请求必须通过此过程,或者脚本本身非常慢,这可能会导致显着的减速。

数据库查询

我还没有用过这个,但看起来很整洁。需要将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]

还有其他几种类型,但这些似乎最适合你。就像我之前说的那样,之前我没有使用自定义程序或数据库查询,所以我可能说错了。希望这里的另一位用户可能会发现我的错误,所以这些都会对你有用。