如何防止非预存用户名绕过密码校验直接启用下一步按钮?
登录逻辑安全漏洞修复方案
问题根源
你的代码失效核心原因是switch语句没有覆盖「用户名不在预存列表」的场景:当输入未定义的用户名时,存储正确密钥的变量不会被赋值,如果后续校验逻辑写法不严谨,就会直接跳过校验放行。
修复步骤
步骤1:补全switch的default分支
给未匹配到的用户名场景设置一个不可能被用户输入匹配的默认密钥值,避免变量未初始化导致的校验逻辑异常。
示例代码:String inputUsername = usernameTextField.getText().trim(); String inputPassword = new String(passwordField.getPassword()).trim(); String correctKey = ""; // 初始化默认值为空字符串 switch (inputUsername) { case "成员1": correctKey = "对应密钥1"; break; case "成员2": correctKey = "对应密钥2"; break; case "成员3": correctKey = "对应密钥3"; break; default: correctKey = ""; // 不存在的用户名统一设置为空密钥 }步骤2:调整校验逻辑顺序
统一判断用户名合法性和密码匹配度,只要任意一项不满足就直接拦截,中断后续跳转逻辑:
// 只要用户名不存在/密码不匹配,就拦截 if (correctKey.isEmpty() || !inputPassword.equals(correctKey)) { JOptionPane.showMessageDialog(this, "用户名或访问密钥错误", "校验失败", JOptionPane.ERROR_MESSAGE); return; // 直接终止后续执行,不允许进入注册页面 } // 校验通过后再执行跳转到注册页的逻辑 // ... 你原有的跳转代码
额外优化建议(适配NetBeans GUI开发场景)
- 后续如果需要频繁增减合法成员,推荐用
HashMap存储用户名和对应密钥,比switch语句更易维护:// 类成员变量位置预存合法成员密钥对 Map<String, String> memberKeyMap = new HashMap<>() {{ put("成员1", "密钥1"); put("成员2", "密钥2"); put("成员3", "密钥3"); }}; // 校验逻辑更简洁 if (!memberKeyMap.containsKey(inputUsername) || !inputPassword.equals(memberKeyMap.get(inputUsername))) { JOptionPane.showMessageDialog(this, "用户名或访问密钥错误", "校验失败", JOptionPane.ERROR_MESSAGE); return; } - 不要将密钥硬编码在源码中,正式上线前建议改成从本地配置文件或服务端接口拉取,避免源码泄露导致安全风险
- 密码输入控件必须使用
JPasswordField,不要用普通JTextField,避免输入时明文泄露
内容的提问来源于stack exchange,提问作者Daisy Pybus
相关产品推荐
相关产品推荐

