渗透测试人员发现用户可无限输入密码次数,超过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);
		}
        }
    }
posted @ 2020-01-08 17:04  段佳伟  阅读(1154)  评论(0编辑  收藏  举报