目录
引言
在 Web 安全的广袤领域中,业务逻辑安全犹如一座隐藏在平静湖面下的冰山,看似不起眼,实则蕴含着巨大的风险。吴翰清在《白帽子讲 Web 安全》一书中,对业务逻辑安全的剖析犹如一把锐利的手术刀,精准地切入各个关键环节。接下来,让我们一同深入探索这一重要的安全领域。
1.账号安全
1.1注册账号
传统 Web 应用以公开的用户名作为账号标识,这就好比在自家门口挂了个写着 “贵重物品在此” 的牌子,方便了攻击者锁定目标进行密码破解。例如早期的一些论坛,用户名直接暴露,攻击者通过简单的字典攻击就能尝试破解大量用户密码。而如今,多数应用采用手机号或邮箱登录,结合可自定义的展示昵称,这无疑给攻击者的破解之路设置了更多障碍。手机号和邮箱相对用户名更为私密,且在找回密码等环节也能发挥重要作用。
在注册过程中,应用需要对用户名进行严格过滤。像 “Admin”“Service” 这类特殊用户名,一旦被别有用心的用户注册,就可能冒充官方人员进行诈骗等恶意行为。可以通过编写如下代码对用户名进行过滤:
def validate_username(username):
special_usernames = ["Admin", "Service"]
if username in special_usernames:
return False
return True
同时,注册流程中还存在诸多安全隐患。比如,要防范他人利用不存在的邮箱 / 手机号注册,这可能导致大量无效账号充斥系统,占用资源。还有绕过短信验证码限制的问题,攻击者可能通过抓包修改请求参数,跳过验证码验证。可以通过在服务端对请求进行严格校验,例如:
from flask import request
@app.route('/register', methods=['POST'])
def register():
phone = request.form.get('phone')
code = request.form.get('code')
# 校验手机号是否合法
if not is_valid_phone(phone):
return "手机号格式错误"
# 校验验证码是否正确
if not check_code(phone, code):
return "验证码错误"
# 进行注册操作
return "注册成功"
1.2登录账号
登录成功后的跳转环节若未对目标 URL 进行校验,就如同在一个陌生城市随意上了一辆陌生人的车,极有可能被带到危险之地。例如,攻击者可以构造一个看似正常的登录成功跳转链接,引导用户进入钓鱼网站,骗取用户账号密码等敏感信息。
为了抵御暴力破解,限制登录次数是一种常见手段。但简单地封禁账号或 IP 存在被恶意利用的风险,比如攻击者可以通过不断尝试错误密码,使正常用户账号被封禁。所以,常采用图像验证码等方式来增加攻击者破解的难度。在登录逻辑中,统一登录错误提示信息也至关重要。如果提示信息区分账号不存在和密码错误,攻击者就能通过不断尝试用户名,获取到有效的账号信息。例如:
function login() {
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
fetch('/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({username: username, password: password})
})
.then(response => response.json())
.then(data =&g

最低0.47元/天 解锁文章
100

被折叠的 条评论
为什么被折叠?



