我正在尝试使用会话来存储登录尝试的数量。当达到最大登录尝试次数时,我将客户端的 IP 地址存储在黑名单表中。
我已经考虑到的一些事情,您可能需要了解:
- 我在
session_regenerate_id();
设置会话值后使用。 - 除了会话之外,我没有使用任何 cookie,因为这不是必需的,也不是 2012 年:p
- 用户 ip 被列入黑名单,直到我从黑名单表中手动删除他的行。
- 是一个已定义的
SESSION_MAX_ATTEMPTS
常数并设置为 5。 - 该
index.php?module=login&task=blacklist
页面只是向用户显示它已被列入黑名单的消息。此页面没有任何功能。 - 我正在使用自定义构建 php 框架,所以我不得不将一些称为方法的 OOP 转换为简化的 php 代码。
在执行登录查询之前调用以下函数:
private function preventAttack()
{
$blocked = getData("SELECT count(*) as blocked FROM blacklist WHERE ip = @Value0;", Array( $_SERVER['REMOTE_ADDR'] ));
if($blocked[0]["blocked"] == "1")
{
redirect("index.php?module=login&task=blacklist");
}
$old = (int)$this->session->get("login_attempts");
if(!empty($old))
{
if($old > SESSION_MAX_ATTEMPTS)
{
setData("INSERT INTO blacklist SET ip = @Value0;", Array( $_SERVER['REMOTE_ADDR'] ));
redirect("index.php?module=login&task=blacklist");
}
else
{
$old++;
$this->session->set("login_attempts",$old);
}
}
else
{
$this->session->set("login_attempts", 0);
}
}
第一个 if 语句有效,包括两个查询,但我被困在存储尝试次数的最佳方式是什么以及 ++ 它的最佳方式是什么?也许你们可以让我朝着正确的方向前进。
如果您对我的代码有任何疑问,请添加评论。我知道它有点不可读,因为它来自我的框架,我在发布之前已经翻译了一点。