2015년 12월 1일 화요일

입력데이터 검증 및 표현 - 신뢰되지 않는 URL 주소로 자동 접속 연결

1)     신뢰되지 않는 URL 주소로 자동 접속 연결
사용자로부터 입력되는 값을 외부사이트의 주소로 사용하여 자동으로 연결하는 서버 프로그램은 피싱(phishing) 공격에 노출되는 취약점을 가질 수 있다. 일반적으로 클라이언트에서 전송된 URL 주소로 연결하기 때문에 안전하다고 생각할 수 있으나, 해당 폼의 요청을 변조함으로써 공격자는 사용자가 위험한 URL로 접속할 수 있도록 공격할 수 있다.

n  안전한 코딩 기법
     자동 연결할 외부 사이트의 URL과 도메인은 화이트리스트로 관리한다.
     사용자 입력값을 자동 연결할 사이트 주소로 사용하는 경우에는 입력된 값이 화이트 리스트에 존재하는지 확인한다.
1.   private final static String allowURL[] = {  
2.           "http://url1.com",  
3.           "http://url2.com",  
4.           "http://url3.com"  
5.   };  
6.   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {  
7.       String nurl = request.getParameter("nurl");  
8.        
9.       try {  
10.          if(nurl == null || "".equals(nurl)) {  
11.                  throw new Exception("error");  
12.              }  
13.              Integer n = Integer.parseInt("nurl");  
14.              if(n >= 0 || n < 3) {  
15.                  response.sendRedirect(allowURL[n]);  
16.              }  
17.                
18.          } catch(NumberFormatException nfe) {  
19.              // 사용자 입력값이 숫자가 아닐 경우 에러 처리
20.          } catch(Exception e) {  
21.              // 사용자 입력값에 문제가 있을 경우 에러 처리
22.          }  
23.  }  


1.   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {  
2.           String url = request.getParameter("url");  
3.           boolean isValid = false;  
4.           try {  
5.               if(url == null || "".equals(url)) {  
6.                   throw new Exception("error");  
7.               }  
8.                 
9.               for(int i=0; i<allowURL.length; i++) {  
10.                  if(url.equals(allowURL[i])) {  
11.                      isValid = true;  
12.                      break;  
13.                  }  
14.              }  
15.                
16.              if(isValid) {  
17.                  response.sendRedirect(url);  
18.              } else {  
19.                  throw new Exception("disallowed url");  
20.              }  
21.          } catch(Exception e) {  
22.              // 사용자 입력값에 문제가 있을 경우 에러 처리
23.          }  
24.  }  

댓글 없음:

댓글 쓰기