问题
在应用表单登录的时候,我们填写用户名和密码,点击登录提交后,提交的信息是以明文向后台发送请求
这样,很容易被非法的人通过此漏洞获得个人的账户和密码信息,给系统安全带来很大的风险。
解决方案
用户在登录表单中填写正常的账户名和密码,进行提交;
在提交的动作插入加密码后的账户和密码,然后提交加密后的账户和密码到后台;
后台接收到登录请求,对账户和密码进行解密,并以用户真正的账户和密码进行身份验证
如可以优化,可以在后台生成临时的登录校验码,并入到加密的运算中,然后在后台获得提交的信息,加入保存的过校验码进行解析(校验码只能使用一次)
解决方法
前端
修改/includes/loginform.jsp
可在页面底引入js,通过js进行加密;
<SCRIPT LANGUAGE="JavaScript"> <!-- function encrypt(value) { return "加密后的值" } function submitLogin(){ var pwd = jQuery("#login-form-password").val(); var user = jQuery("#login-form-username").val(); var encyptPass = encrypt(pwd); var encyptUser = encrypt(user); jQuery("#login-form-password").val(encyptPass); jQuery("#login-form-username").val(encyptUser); jQuery("#login-form").submit(); } //--> </SCRIPT>
后端
后台对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; }