[시큐어코딩실습] 잘못된 접근제어 취약점 제거 안전한코딩
사용자로 부터 수신한 작업 요청이 해당 세션의 사용자가 실행권한을 가지고 있는지 체크하여 권한이 있는 사용자로 부터의 요청인 경우에만 작업을 수행할 수 있도록 한다. 예제에서는 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; } |