본문 바로가기
보안

[웹 취약점] 자바 패스워드 5회,계정 잠금 ,계정 비활성화

by MMXVI 2023. 2. 15.
728x90
반응형
SMALL

패스워드 5회 잠금 연습

 

 

 

 

 

 

 

 

 

 

반응형

LoginVO 

 

 
//LoginVO
public class LoginVO extends UserVO {
//로그인 5회실패 일자
 private int FailLastDt=0;
//로그인 실패 횟수 
private int PwErrorCnt =0;





public int getPwErrorCnt() {
		return PwErrorCnt;
	}

	public void setPwErrorCnt(int pwErrorCnt) {
		PwErrorCnt = pwErrorCnt;
	}

	public int getFailLastDt() {
		return FailLastDt;
	}

	public void setFailLastDt(int failLastDt) {
		FailLastDt = failLastDt;
	}
}

 

728x90

Controller

// controller 부분
@RequestMapping("")//Mapping값을 입력 해주세요.
public ModelAndView loginCheck(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletRequest request, HttpServletResponse response, ModelMap model) throws BaseException {
//로그인 성공로직~
{
//로그인 성공로직 추가~

}
//조건

LoginVO lvo = loginService.view(loginVO);//로그인 정보 및 실패 횟수 실패날짜 조회 


boolean loginlock =true;
if(lvo != null ){
loginlock = loginlock(request,lvo);
}

if(loginlock) {
//로그인 5회이상 실패 잠금시간이 지나지 않았을경우  
if(lvo != null && lvo.getPwErrorCnt() > 4) {
//실패 처리 부분
int mm = (600)/60 -(lvo.getFailLastDt()/60) ; //로그인 실패 일자와 -10분  남은시간 구하기
("message", egovMessageSource.getMessage("")+mm+"분 뒤 다시 시도해주세요.");// 실패 메세지 부분
}else{
//로그인 페이지로 이동

}else{

("message", egovMessageSource.getMessage(""));// 실패 메세지 부분
//로그인 실패 기록하는 class 호출
LoginLog lgl = new LoginLog();
lgl.setLog(request, loginlock, userId, loginVO.getUserPw());//다시 실패횟수를 늘려주기위한 로직

}

public boolean loginlock(HttpServletRequest request,LoginVO lvo) throws BaseException {

int max =600; //10분
if(lvo.getFailLastDt() >= max) {
lvo.setPwErrorCnt(0); //10분 초과시 0으로 update 
loginService.updatePwErrorCnt(lvo);
    
}else {

}
return true;
}


/** 로그인 실패 기록  
*/
class LoginLog  {
// 로그 실패 기록
	public void  setLog(HttpServletRequest request, boolean loginlock, String userId, String userPw) {
    // 1. 사용자 검사
			LoginVO loginVO = new LoginVO();
			loginVO.setUserId(userId);
			loginVO.setuserPw(userPw);

			//loginlock ture 계정이 잠겨있지 않을경우 
            if(loginlock){
				LoginVO lvo = loginService.view(loginVO);
				if(lvo == null){
					//메세지 부분 ("사용자 정보가 없습니다.");
				}else if(lvo != null && !userPw.equals(lvo.getUserPw())){
					// 패스워드 오류 횟수 증가
					lvo.setPwErrorCnt(lvo.getPwErrorCnt()+1);                    
					loginService.updatePwErrorCnt(lvo);
				//메세지 부분 ("비밀번호 5회이상 틀릴경우 10분간 계정이 잠깁니다.");
				}
                               
			}else{
				//로그인 정책의 맞게  예외의 경우를 메세지를 추가해주면됩니다.
			}
    	//실패 log를 남기려면 여기서 추가해주시면 됩니다.
    }

 

 

 

 

SMALL

 

Service >> Impl  >> Mapper

 

//service

public int updateUserPw(LoginVO entity) throws BaseException;
public int updatePwErrorCnt(LoginVO entity) throws BaseException;



//Impl
public int updatePwErrorCnt(LoginVO entity) throws BaseException {
		return mapper.updatePwErrorCnt(entity);
	}
	public int updateUserPw(LoginVO entity) throws BaseException {
		return mapper.updateUserPw(entity);
	}
    
 //mapper
 	public int updateUserPw(LoginVO entity) throws BaseException;

	public int updatePwErrorCnt(LoginVO entity) throws BaseException;

 

 

Mapper.xml

//oracle
SELECT 
   --로그인 관련 컬럼 
  ,(SYSDATE-A.FAIL_LAST_DT)* 24 * 60 * 60 FAIL_LAST_DT  //현재 날짜와 실패날짜 초단위로 가져오기
 
  FROM [유저테이블]
WHERE USER_ID = #{유저id로조회}




UPDATE [유저테이블] SET
  PW_ERROR_CNT = #{pwErrorCnt}
 <if test='pwErrorCnt > 4 ' > //4회이상 틀릴경우에 현재시간으로 UPDATE
  ,FAIL_LAST_DT =SYSDATE
  </if>
  
WHERE USER_ID = #{유저id로조회}

 

 

 

Oracle 유저테이블 컬럼 추가 

FailLastDt   : Number(10,0)

PwErrorCnt : DATE

 

 

 

728x90
반응형
LIST

댓글