渗透测试人员发现用户可无限输入密码次数,超过5次未锁定用户,存在暴力破解风险。解放方案:限制每个输入的用户名(不管存不存在该账户)登陆失败次数不超过5次,超过则锁定该用户
漏洞描述
渗透测试人员发现用户可无限输入密码次数,超过5次未锁定用户,存在暴力破解风险。
漏洞建议
限制每个输入的用户名(不管存不存在该账户)登陆失败次数不超过5次,超过则锁定该用户。
解决方案:
把登陆的用户名 如果输错一次,那么就写入缓存memcache中,num+1,key是用户名,value是登陆失败次数,如果超过5次,设置过期时间
所用语言php
框架ci
/**
* 2020.1.8新增 限制每个输入的用户名(不管存不存在该账户)登陆失败次数不超过5次,超过则锁定该用户。 写入到缓存中,设置过期时间
*/
$this->load->library('Memcached');
// 先去mem中判断该用户是否存在,看有几次登陆失败次数,如果超过5次,那么就返回 你的账户已经被锁定了,期限1天
$fail_num = $this->memcached->_get($username) ? $this->memcached->_get($username) : 0;
if ($fail_num >= 5){
$this->returnData('error','你的账户已经被锁定了!期限1天');
}
(empty($username) || !preg_match("/^[a-zA-Z0-9]{4,16}$/",$username)) ?($this->addMem($fail_num, $username)). ($this->returnData('error','请输入正确的用户名!')) : '';
(empty($password) || strlen($password) > 20 || strlen($password) < 5) ? ($this->addMem($fail_num, $username)).($this->returnData('error','请输入正确的密码!')) : '';
(empty($result)) ? ($this->addMem($fail_num, $username)) . ($this->returnData('error','用户名或密码不正确')) : '';
/**
* 封装的mem 锁定用户的公用方法
*/
private function addMem($fail_num, $username)
{
$this->load->library('Memcached');
if ($fail_num >= 5){
$this->memcached->_set($username,++$fail_num,3600*24);
} else {
$this->memcached->_set($username,++$fail_num);
}
}
}