Page tree
Skip to end of metadata
Go to start of metadata

问题

在应用表单登录的时候,我们填写用户名和密码,点击登录提交后,提交的信息是以明文向后台发送请求

这样,很容易被非法的人通过此漏洞获得个人的账户和密码信息,给系统安全带来很大的风险。


解决方案

用户在登录表单中填写正常的账户名和密码,进行提交;

在提交的动作插入加密码后的账户和密码,然后提交加密后的账户和密码到后台;

后台接收到登录请求,对账户和密码进行解密,并以用户真正的账户和密码进行身份验证

如可以优化,可以在后台生成临时的登录校验码,并入到加密的运算中,然后在后台获得提交的信息,加入保存的过校验码进行解析(校验码只能使用一次)

解决方法

前端(JIRA)

修改/includes/loginform.jsp

前端(Confluence)

修改/login.vm

修改示例

控制提交按钮的行为,可在页面底引入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;
}














  • No labels