【问题标题】:Dynamic whitelist with htaccess allowing a form to add an IP to the whitelist?使用 htaccess 的动态白名单允许表单将 IP 添加到白名单?
【发布时间】:2013-06-11 02:08:23
【问题描述】:

在为客户开发开发站点时,我们希望拒绝来自该站点的所有访问,但允许在外出开会或在家工作时轻松将白名单列入白名单(动态 IP)。

我们想要做的是有一个表格,将您的 IP 地址写入 htaccess 文件,并在其上方添加注释,说明这是谁或谁授权等。

在不涉及大量细节的情况下,简单的密码在我们的案例中是行不通的,让人们监控电子邮件帐户的请求,让客户获得自己的 IP 地址,诸如此类的事情根本行不通。

如果允许这些在 htaccess 中添加的 IP 地址过期,那就更好了。所以我认为像这样的复杂逻辑不会在 htaccess 本身中运行,所以它需要由第 3 方软件管理,除非有人有任何其他想法?

【问题讨论】:

标签: php .htaccess lamp


【解决方案1】:

我推荐使用 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 脚本一起工作,它必须无限期地运行,读取标准输入并写入标准输出。

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]

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

【讨论】:

  • 我正在尝试平面文件变体,但它会吐出 500 错误。我尝试调整路径,但无济于事。
  • 我忘了提,我会把这个放在我的帖子里。您不能将 RewriteMap 添加到 .htaccess 文件中。您必须将它们添加到 Apache 的 httpd.conf
  • 这是否会阻止它在安装中的单个域/站点上使用?我们不希望此列表适用于某些网站。
  • 通常每个站点都在 记录中,您可以将这些规则放在特定站点的 记录中
  • 我有一个问题@chrislondon。您最喜欢哪种方法来允许/禁止 IP 地址,并且在效率方面更好。请记住,可以每天添加/删除允许/禁止 IP 地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2022-08-16
  • 2016-02-21
  • 2016-10-26
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多