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

Django 开发 专栏收录该内容
5 篇文章 0 订阅

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

口令爆破

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

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

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')

方法讨论

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

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

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

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
程序员必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元编程大礼包 【超实用课程内容】  根据《2019-2020年中国开发者调查报告》显示,超83%开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺技能!   套餐中一共包含2门MySQL数据库必学核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识人;  2)对MySQL掌握程度薄弱人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好MySQL内功,工作中遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底问题问到怀疑人生应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效管理MySQL数据库。 课程二:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL最佳性能优化方法,掌握如何处理海量业务数据和高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,日常工作中代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我课程中进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料打包下载。
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值