solution10 / heat
暴力破解预防助手库。
Requires
- php: >=7.0
- doctrine/cache: ^1.3
Requires (Dev)
- phpunit/phpunit: ^5.0
- silex/silex: ^2.0
- squizlabs/php_codesniffer: ^2.7
- symfony/http-foundation: ^3.2
This package is not auto-updated.
Last update: 2024-09-14 19:53:20 UTC
README
这是一个简单的库,用于跟踪给定用户(通常通过他们的IP识别)的恶意行为,并在他们犯错过多时将其锁定。常见用途包括防止对您的登录端点的暴力破解和字典攻击。
理论
用户可能会犯错,但这些错误也可能是攻击的信号。考虑一个登录表单;用户可能会在输入密码时犯错,但经过几次尝试后,可能就是有人试图通过猜测密码暴力破解系统。
这个库提供了一种跟踪“热量”的方法 - 每当用户进行可疑操作时,他们的热量评分就会增加,直到他们需要执行某些其他操作来确保他们是真实的,例如解决一个CAPTCHA。这些热量在执行操作时会累积,并存储一段时间。
此库仅提供简单的跟踪机制,以及一个Silex服务提供者,以帮助将其与该框架挂钩。
用法
库非常简单易用
创建实例
$c = new Doctrine\Common\Cache\RedisCache(); $h = new Solution10\Heat\Heat($_SERVER['REMOTE_ADDR'], $c);
您需要提供用户的标识符以及一个 Doctrine\Common\Cache\Cache
实例,用作存储后端。
在上面的例子中,我们使用 $_SERVER['REMOTE_ADDR']
,但这是一个 坏主意。最好使用类似 Symfony\Component\HttpFoundation\Request::getClientIp()
的方法,它考虑到代理等因素。
跟踪热量
$c = new Doctrine\Common\Cache\RedisCache(); $h = new Solution10\Heat\Heat($_SERVER['REMOTE_ADDR'], $c); if ($user->gotTheirPasswordWrong()) { $h->increase(25); } if ($user->solvedCAPCTHA()) { $h->decrease(50); }
您可以使用 increase()
和 decrease()
方法增加和减少当前标识符的热量。
如果用户做了非常好的事或非常糟糕的事,您可以使用 increaseToMaximum()
和 decreaseToMinimum()
立即增加/减少用户的热量。 您应该仅在极端情况下这样做。
不要 仅因为用户登录就重置用户的热量。如果您这样做,攻击者只需定期用他们的账户登录即可重置热量!让生命周期完成它的任务。
您可以使用 setMaxTemperature()
和 setMinimumTemperature()
调整最大和最小温度,默认值分别为100和0。
您可以使用 $h->getTemperature()
读取任何时间的热量。
状态
标识符可以是三种状态之一; SAFE
、WARNING
和 CRITICAL
。
SAFE:用户还没有做出足够的事情引起怀疑。暂时认为他们没问题。
WARNING:用户已经执行了足够多的操作,使其热量达到最大值的60%以上。可能需要给他们一个CAPTCHA来验证他们是否合法。
CRITICAL:用户已经达到最大热量,应该被认为很危险。应该暂时阻止他们登录。
您可以使用以下方法检查状态
// Boolean checks; $h->isSafe(); $h->isWarning(); $h->isCritical(); // Checking state against constants; $h->getState() === Heat::SAFE; $h->getState() === Heat::WARNING; $h->getState() === Heat::CRITICAL;
您可以使用 $h->setSafeThreshold(0.4)
调整SAFE和CRITICAL之间的阈值。此值是一个表示最大温度百分比的浮点数,因此将值设置为0.4表示最大值的40%。
生命周期
温度通过使用write()
写入到Cache实例中,该操作只有在从加载后值发生变化时才会更新值。这很重要,因为这意味着热量会累积并持续到你定义的类的生命周期,并且可能持续更长时间。
考虑这种情况:一个用户尝试了三次登录,将温度提升到60%。然后他们什么也不做三分钟,或者正确登录,然后尝试暴力破解。之前的三个尝试仍然存在,新的尝试将用户的热量提升到80%,这意味着用户将在接下来的五分钟内保持在80%。
默认的生命周期是300秒或五分钟。
您可以使用以下方法获取和设置生命周期:
$h->getLifetime(); $h->setLifetime(3600);
其他方法
您期望的所有内容都有getter和setter方法。
$h->getIdentifier(); $h->setIdentifier(string $identifier); $h->getStorage(); $h->setStorage(Cache $storage); $h->getStoragePrefix(); $h->setStoragePrefix(string $storagePrefix); $h->getMaxTemperature(); $h->setMaxTemperature(int $maxTemperature); $h->getMinTemperature(); $h->setMinTemperature(int $minTemperature); $h->getSafeThreshold(); $h->setSafeThreshold(float $safeThreshold); $h->getLifetime(); $h->setLifetime(int $lifetime);
Silex 服务提供者
该库为Silex微框架提供了一个服务提供商,这使得集成变得简单。
按正常方式注册提供商
$app = new Silex\Application(); $app->register(new \Solution10\Heat\HeatTrackerServiceProvider(), [ 's10.heat.storage' => new RedisCache() // replace as appropriate ]);
此提供商在DI路径$app['s10.heat']
中提供了一个Solution10\Heat\Heat
实例,并将其绑定到$app->before()
和$app->finished()
方法,以提供来自IP地址的标识符和write()
方法调用。
您可以将s10.heat.storage
参数传递给register()
以使用您自己的缓存提供商。如果您没有提供,它将使用ArrayCache
,这完全无用,因为它不会持久化!
PHP 要求
- PHP >= 7.0