Django 实现有点安全的网站登录认证机制——口令爆破

这次讲一下登录认证机制中最常见的口令爆破漏洞

口令爆破

口令爆破其实就是攻击者对用户口令进行穷举尝试。在用户登录界面,攻击者通过遍历生成口令或者加载口令字典,进行多次登录尝试,直至把用户口令穷举出来,成功登录

因为一般能被成功猜测出的用户口令都是弱口令,所以口令爆破也称弱口令漏洞

klbp

口令破解的漏洞原理其实很简单,即网站未对用户登录认证的请求频率和次数进行限制,使得攻击者可以无数次地进行遍历口令登录。从理论上讲,只要加载的字典范围足够大,尝试的次数足够多,攻击者可以把任意用户的口令穷举出来

防护手段

防御口令爆破的方法很简单,我们对认证请求频率和失败次数进行限制,使攻击者不能无代价地进行口令尝试。如果攻击者进行口令爆破所需要付出的成本,高出其可接纳的范围,那么在一定程度上,我们达到了安全

同前面注册页面的用户枚举漏洞讨论的一般,我们可以通过增加验证码机制来辨别人和机器,从而限制自动化工具在认证请求处的使用,进而达到限制认证请求频率的效果

yzm

而对认证失败次数进行限制的方案又可分两种。一是把认证失败次数记录在数据库中和用户数据相关联的,这样可对单个用户的失败次数进行限制。当一个具体用户的口令错误次数达到某个值时,对其进行认证限制。如,在一段时间内不允许该用户再次进行登录尝试,或者直接永久冻结
另一种则是把认证失败的次数记录到 Session 中,如此可限制单个客户端上请求的认证失败的次数(基于 Cookie 判断)。当某个客户端上发起的认证请求(不管是不是同一个用户的登录尝试)失败次数到达某个值时(在一个 Session 有效期内),对该客户端上发起的认证请求进行限制

如下代码所示,

def login(request):
	if request.session.get('is_login', None):  # 检查是否已登录
		return redirect('/index/')
	if request.method == 'POST':  # 如果有提交表单
		if not request.session.get('fail_count', None):
			request.session['fail_count'] = 0
		if request.session['fail_count'] == 8:
			return render(request, 'login.html', {'mess': '登录失败达8次,请30分钟后再尝试'})
		username = request.POST.get('username', '').strip()
		password = request.POST.get('password', '').strip()
		try:
			user = User.objects.get(username=username)
		except User.DoesNotExist:
			request.session['fail_count'] += 1  # 失败次数加一
			return render(request, 'login.html', {'mess': '用户名或密码输入错误'})
		else:
			if check_password(password, user.password):
				request.session['fail_count'] = 0  # 清零
				request.session['is_login'] = 'T'  # 标记已登录
				request.session['user_id'] = user.id
				request.session['username'] = username
				return redirect('/index/')
			else:
				request.session['fail_count'] += 1  # 失败次数加一
				return render(request, 'login.html', {'mess': '用户名或密码输入错误'})
	return render(request, 'login.html')

方法讨论

上述两种防御方法各有其优劣,限制认证失败次数的方法显然是更为安全的,但给用户的体验感可能不如使用验证码限制登录请求频率的方法。比方说,某用户忘记了自己的口令,需要经过有限次的尝试来找回,该用户自然不希望在尝试口令时,其用户账号被冻结或者被限制登录

显然,这需要根据网站的服务性质和安全需求程度来选择防御口令爆破的方法
如果是类似理财和银行这种安全需求极高的网站,可以选择限制认证失败次数以及冻结账号的方法,宁可杀错,不可放过。如果网站更看重用户的体验感,追求的是方便快捷的服务性质,而相对于安全的需求没有那么高,那么可以使用验证码来限制自动化工具

一个比较常用,且可获得极佳用户体验感的方法是,记录登录失败的次数,当其达到某一个阈值时,增加验证码机制来限制自动化工具

©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值