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.  }  

댓글 없음:

댓글 쓰기