metarush/firewall

一个为想要黑名单/白名单IP地址的Web应用程序提供的防火墙

v1.1.0 2019-04-14 17:40 UTC

This package is auto-updated.

Last update: 2024-09-15 05:49:51 UTC


README

一个Web应用程序可以使用该防火墙库临时或长期禁止IP地址

示例用例

当用户在您的应用程序中(例如,登录)连续5次失败时,此库将临时锁定他们15分钟。之后,他们可以最多尝试5次临时锁定。之后,他们将锁定24小时。

摘要

  • 15分钟内5次失败 = 15分钟临时锁定
  • 5次临时锁定 = 24小时锁定

注意:这些设置可以更改

安装

通过composer以metarush/firewall的方式安装

设置

  1. 创建一个数据库(例如,支持PDO的MySQL、SQLite)。

  2. 创建以下名称的表

    • tempBan
    • extendedBan
    • whitelist
    • failCount
    • blockCount

    注意:您可以使用不同的表名,但这些是默认名称

  3. 每个表必须有以下字段

  • ip (STRING,长度为45 )
  • dateTime (STRING,长度为19 )

使用您数据库类型的适当列类型。例如,dateTime将存储日期,格式为Y-m-d H:i:s,因此如果您的数据库是MySQL,请使用DATETIME列类型。

MySQL的示例创建表查询

CREATE TABLE `tempBan` (
    `ip` VARCHAR(45),
    `dateTime` DATETIME
) ENGINE=MyISAM;

使用默认设置的使用

初始化库

<?php

$builder = (new \MetaRush\Firewall\Builder)
    ->setDsn('mysql:host=localhost;dbname=yourfirewalldb')
    ->setDbUser('user')
    ->setDbPass('pass');

$fw = $builder->build();

在登录代码中的基本使用

$fw->flushExpired(); // put this on top

if ($fw->banned($_SERVER['REMOTE_ADDR'])) {
    exit('Forbidden'); // or redirect somewhere else
}

if ($_POST['password'] != 'foo') {

    $fw->preventBruteForce($_SERVER['REMOTE_ADDR']);

    // show your error page
    exit('Invalid login');

} else {

    // release IP from block counters
    $fw->flushIp($_SERVER['REMOTE_ADDR']);

    // proceed to login...
}

自定义设置

您可以在类初始化时附加以下方法

表名

如果您的表名不同,通过以下方式让系统知道

->setTempBanTable('tempBan')
->setExtendedBanTable('extendedBan')
->setWhitelistTable('whitelist')
->setFailCountTable('failCount')
->setBlockCountTable('blockCount')

临时禁止之前的最大失败次数

->setMaxFailCount(5)

临时禁止秒数

->setTempBanSeconds(900) // 15 minutes

在扩展禁止之前的最大临时禁止次数

->setMaxBlockCount(5)

扩展禁止秒数

->setExtendedBanSeconds(86400) // 1 day

在此期间,失败尝试被视为临时禁止的候选

->setFailCountSeconds(900) // 15 minutes

在此期间,临时锁定被视为扩展禁止的候选

->setBlockCountSeconds(86400) // 1 day

白名单秒数

->setWhitelistSeconds(2592000) // 30 days

注意:参数中显示的值是它们的默认值。每个setter方法都有其对应的getter方法。例如,getMaxFailCount();

应用自定义设置

$builder = (new \MetaRush\Firewall\Builder)
    ->setDsn('mysql:host=localhost;dbname=foo')
    ->setDbUser('user')
    ->setDbPass('pass')
    ->setTempBanTable('tempBan')
    ->setExtendedBanTable('extendedBan')
    ->setWhitelistTable('whitelist')
    ->setFailCountTable('failCount')
    ->setBlockCountTable('blockCount')
    ->setMaxFailCount(5)
    ->setTempBanSeconds(900)
    ->setMaxBlockCount(5)
    ->setExtendedBanSeconds(86400)
    ->setWhitelistSeconds(2592000);

$fw = $builder->build();

可用方法

您可以使用以下方法满足您的自定义需求

tempBan

临时禁止$ip

tempBan(string $ip): void

extendedBan

禁止$ip一段较长的时间

extendedBan(string $ip): void

banned

如果$ip被禁止(临时或长期),则返回true,否则返回false

banned(string $ip): bool

whitelist

$ip添加到白名单,使其不会被禁止

whitelist(string $ip): void

whitelisted

如果$ip被添加到白名单,则返回true,否则返回false

whitelisted(string $ip): bool

preventBruteForce

如果达到getMaxFailCount(),则临时禁止$ip;如果达到getMaxBlockCount(),则禁止$ip一段较长的时间

preventBruteForce(string $ip): void

flushExpired

释放所有被禁止(临时/长期)和白名单超过设置限制的IP地址

flushExpired(): void

注意:定期在脚本顶部或通过cron运行此操作

flushTempBanned

无论过期时间如何,释放所有临时禁止的IP地址

flushTempBanned(): void

flushExtendedBanned

释放长期禁止的IP,无论过期时间如何

flushExtendedBanned(): void

flushWhitelisted

flushWhitelisted(): void

释放白名单中的IP,无论过期时间如何

flushIp

释放所有"block"表中的IP,并可选择释放到白名单表

flushIp(string $ip, bool $alsoWhitelistTable = false): void