슈개's IT/SW개발보안

[SW개발보안] 개발보안 기타 정리 내역2

슈개 2021. 1. 23. 10:17
반응형

[SW개발보안] 개발보안 기타 정리 내역2

 

적절한 인증 없는 중요 기능 허용

회원정보 변경 신청 페이지

<form action="modify.do" method="post" onsubmit="return passwordCheck()">

<fieldset >

    <legend><b>회원정보수정</b></legend>

    <table>

      <tr>

        <td class="td01"  ><label for="userId"  class="label01">사용자ID  </label></td>

        <td><input type="text" id="userId" name="userId" class="loginInput" value="${member.userId}"  readonly="readonly"/></td> ⇐ 사용자 ID를 편집(수정)할 수 없도록 제한

        <td><span class="error"><form:errors path="MemberModel.userId" /></span></td>

      </tr>

      <tr>

        <td class="td01" ><label for="userName" class="label01" >회원이름  </label></td>

        <td><input type="text" id="userName" name="userName"  value="${member.userName}" class="loginInput"/></td>

        <td><span class="error"><form:errors path="MemberModel.userName" /></span></td>

      </tr>

      <tr>

        <td class="td01" ><label for="oldUserPw" class="label01">기존비밀번호 </label></td>

        <td><input type="password" id="oldUserPw" name="oldUserPw" class="loginInput"/></td>

        <td><span class="error"><form:errors path="MemberModel.userPw" /></span></td>

      </tr>

      <tr>

        <td class="td01" ><label for="userPw" class="label01">신규비밀번호 </label></td>

        <td><input type="password" id="userPw" name="userPw" class="loginInput"/></td>

        <td><span class="error"><form:errors path="MemberModel.userPw" /></span></td>

      </tr>

      <tr>

        <td class="td01" ><label for="userPwCheck" class="label01">신규비밀번호확인  </label></td>

        <td><input type="password" id="userPwCheck" name="userPwCheck" class="loginInput"/></td>

        <td></td>

      </tr>

      <tr>

        <td colspan="3" align="center">

              <br/><br/>

              <input type="submit" value="확인" class="submitBt"/>

          <input type="reset" value="재작성" class="submitBt" />

    </td>

      </tr>

      <tr>

        <td colspan="3" align="center"><a href="<%=request.getContextPath()%>/login.do">로그인 페이지로 돌아가기</a></td>

      </tr>

    </table>

</fieldset>

  </form>

 

 

 

 

회원정보 변경 처리 ⇒ 교재에 나와있는 코드                 

@RequestMapping(value = "/modify.do", method = RequestMethod.POST)       ↱ 사용자 화면에서 입력한 값이 저장

public ModelAndView memberModifyProcess(@ModelAttribute("MemberModel") MemberModel memberModel, BindingResult result, HttpServletRequest request, HttpSession session) {

ModelAndView mav = new ModelAndView();

String userId = (String) session.getAttribute("userId"); ⇒ #1 세션에서 사용자 ID를 추출

String passwd = request.getParameter("oldUserPw");       ⇒ #2 요청 파라미터에서 패스워드를 추출

System.out.println("passwd: " + memberModel.getUserPw());

 

if (loginService.checkUserId(userId, passwd) == null) {  ⇒ #1, #2 정보가 존재하는지 확인

mav.addObject("errCode", 1);                         로그인한 사용자가 요청한 것인지를 확인

mav.addObject("member", memberModel);

mav.setViewName("/board/member_modify");

return mav;

}

 

// #4 요청한 사용자와 로그인한 사용자가 동일한 사용자인지를 재인증하는 코드를 추가

String pUserId = request.getParameter("userId");

if (pUserId == null || !pUserId.equals(userId)) {

// 일치하지 않으면 오류 처리와 함께 반환

 

if (service.modifyMember(memberModel)) {  ⇒ #3 화면에서 전달된 값으로 회원정보를 업데이트

      mav.setViewName("redirect:/board/list.do");  → 화면에서 전달된 사용자 ID를 기준으로 수정 가능

session.setAttribute("userName", memberModel.getUserName());

return mav;

} else {

mav.addObject("errCode", 2);

mav.setViewName("/board/member_modify");

return mav;

}

}

 

 

 

 

적절한 인증없는 중요기능 허용

 

부적절한 인가

 

취약한 암호화 알고리즘 사용

인코딩/디코딩 기능을 이용한 암복호화 기능 구현

 

function encrypt(String source) {

return base64encoding(source);

}



암호알고리즘, 블럭운영모드, 패딩모드

      ~~~ 블럭운영모드

AES / CBC / PKCS5Padding

~~~ 알고리즘명      패딩모드



코드 서명 및 검증

Server                          Client 

code ~~~~~~~~~~~~~~~~~~~~~~~~~> code  

-> H(code)                      -> H(code) -------------------------+ 일치

   -> Spri[H(code)] ~~~~~~~~~~> Spri[H(code)] -- Spub --> H(code) --+

                                               

 

잠시 쉬고, 14시 15분에 이어서 진행하겠습니다. 

 

오류상황 대응 부재

CASE1 ⇒ catch 블록이 비어 있는 경우 

try { 

:

예외가 발생할 수 있는 코드 

:

} catch (예외 e) { 

// 예외 처리 로직이 생략

}

 

CASE2 ⇒ 예외에 대한 처리가 없는 경우 

try { 

:

예외1가 발생할 수 있는 코드 

:

예외2가 발생할 수 있는 코드 

:

} catch (예외1 e) { 

예외1에 대한 처리

}

 

빠른 연산자 (circuit operator)

 

(   T   ) | (  T/F  ) = T

(   T   ) || (      ) = T

 

(   F   ) & (   T/F ) = F

(   F   ) && (      ) = F




부적절한 자원해제

CASE1. close() 메서드가 finally  구문이 아닌 곳에 위치

try { 

자원을 생성

:

자원을 사용

:

자원.close(); ⇐ CASE1

} catch(예외 e) {

자원.close(); ⇐ CASE1

예외처리

} finally {

자원.close();

}

 

CASE2. 자원 생성 부분은 있으나 close() 메서드가 없는 경우 






abc.jsp ---> abc_jsp.java ---> abc_jsp.class 

 

<%! String name; %> ---------> 멤버변수

<%  String name; %> ---------> _jspService() 메소드의 지역변수

 

반응형