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

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Current »

问题

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

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


解决方案

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

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

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

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

解决方法

前端

修改/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;
}














  • No labels