问题
在应用表单登录的时候,我们填写用户名和密码,点击登录提交后,提交的信息是以明文向后台发送请求
这样,很容易被非法的人通过此漏洞获得个人的账户和密码信息,给系统安全带来很大的风险。
解决方案
用户在登录表单中填写正常的账户名和密码,进行提交;
在提交的动作插入加密码后的账户和密码,然后提交加密后的账户和密码到后台;
后台接收到登录请求,对账户和密码进行解密,并以用户真正的账户和密码进行身份验证
如可以优化,可以在后台生成临时的登录校验码,并入到加密的运算中,然后在后台获得提交的信息,加入保存的过校验码进行解析(校验码只能使用一次)
解决方法
前端(JIRA)
修改/includes/loginform.jsp
前端(Confluence)
修改/login.vm
修改示例
控制提交按钮的行为,可在页面底引入js,通过js进行加密;
后端
后台对request获得的账户名和密码进行加密,并获得解密后的账户名和密码进行后续的验证。
注意验证包含以下几种场景
- 本地验证(jira本地目录的用户)
- LDAP验证(交由LDAP进行验证)
- Authorization 的认证方式
可修改以下类中的方法:
- com.atlassian.seraph.filter.LoginFilter#extractUserPasswordPair
- com.atlassian.seraph.filter.HttpAuthFilter#extractUserPasswordPair
LoginFilter
protected UserPasswordPair extractUserPasswordPair(HttpServletRequest request) { // check for parameters String username = request.getParameter(RequestParameterConstants.OS_USERNAME); String password = request.getParameter(RequestParameterConstants.OS_PASSWORD); String newusername = "解密后的用户名"; String newpassword = "解密后的密码"; boolean persistentLogin = "true".equals(request.getParameter(RequestParameterConstants.OS_COOKIE)); return new UserPasswordPair(newusername, newpassword, persistentLogin); } }
HttpAuthFilter
protected UserPasswordPair extractUserPasswordPair(HttpServletRequest request) { String auth = request.getHeader("Authorization"); if (SecurityUtils.isBasicAuthorizationHeader(auth)) { SecurityUtils.UserPassCredentials creds = SecurityUtils.decodeBasicAuthorizationCredentials(auth); if (!"".equals(creds.getUsername())) { String username = creds.getUsername(); String password = creds.getPassword(); String newusername = "解密后的用户名"; String newpassword = "解密后的密码"; return new UserPasswordPair(newusername,newpassword, false); } } return null; }