漏洞描述
滲透測試人員發現用戶可無限輸入密碼次數,超過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);
}
}
}