暴力破解预防助手库。

v1.0.0 2017-02-04 17:10 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:53:20 UTC


README

这是一个简单的库,用于跟踪给定用户(通常通过他们的IP识别)的恶意行为,并在他们犯错过多时将其锁定。常见用途包括防止对您的登录端点的暴力破解和字典攻击。

Build Status Latest Stable Version Total Downloads License

理论

用户可能会犯错,但这些错误也可能是攻击的信号。考虑一个登录表单;用户可能会在输入密码时犯错,但经过几次尝试后,可能就是有人试图通过猜测密码暴力破解系统。

这个库提供了一种跟踪“热量”的方法 - 每当用户进行可疑操作时,他们的热量评分就会增加,直到他们需要执行某些其他操作来确保他们是真实的,例如解决一个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() 读取任何时间的热量。

状态

标识符可以是三种状态之一; SAFEWARNINGCRITICAL

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

作者

Alex Gisby: GitHubTwitter

许可

MIT