metarush / firewall
一个为想要黑名单/白名单IP地址的Web应用程序提供的防火墙
Requires
- php: >=7.1
- metarush/data-mapper: ^1.0
Requires (Dev)
- phpunit/phpunit: ^7.5
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
的方式安装
设置
-
创建一个数据库(例如,支持PDO的MySQL、SQLite)。
-
创建以下名称的表
tempBan
extendedBan
whitelist
failCount
blockCount
注意:您可以使用不同的表名,但这些是默认名称
-
每个表必须有以下字段
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