본문 바로가기

보안/시큐어코딩

[시큐어코딩실습] 잘못된 접근제어 취약점 제거 안전한코딩

사용자로 부터 수신한 작업 요청이 해당 세션의 사용자가 실행권한을 가지고 있는지 체크하여 권한이 있는 사용자로 부터의 요청인 경우에만 작업을 수행할 수 있도록 한다. 예제에서는 delete 작업 요청한 사용자가 로그인 세션의 userid와 동일한자, 해당 동작을 수행할 수 있는 사용자인지를 체크하기 위해 checkAccessControlList 를 구현하고 호출하도록 작성하였다.



@RequestMapping(value="/test/access_control_test.do", method = RequestMethod.POST)

@ResponseBody

public String testAccessControlPost(HttpServletRequest request,HttpServletResponse response){

             StringBuffer buffer=new StringBuffer();

         String name=request.getParameter("name");

             String action=request.getParameter("action");

             if( "view".equals(action)) {

                           buffer.append("==> 사용자 정보조회<br/>");

             }else if( "modify".equals(action)) {

                           aclData[1] = name;

                           buffer.append("==> 사용자 정보수정<br/>");

             }else if ( "delete".equals(action)) {

                 if ( checkAccessControlList(name) ) {

                               aclData[0]="";

                               aclData[1]="";

                               buffer.append("==> 사용자정보삭제<br/>");

                 } else {

                     buffer.append("==> 허용되지 않은 요청입니다.<br/>");

                 }

             }else if ( "edit".equals(action)) {

                           aclData[0]=name;

                           buffer.append("==> 사용자정보생성<br/>");

             }           

                          

                           buffer.append("사용자명: "+aclData[0]+"<br/>");

                           buffer.append("   전화번호: "+aclData[1]);

                           return buffer.toString();

}

 

public boolean checkAccessControlList(String name){

     String[] allowList = {"admin". "manager","root"};

     String userid = request.getSession.getAttribute("userid");

     if ( ! userid.equals(name)) return false;

     for(String allow : allowList ) {

         if ( allow.equals(name)) return true;

     }

     return false;

}