2015년 12월 1일 화요일

입력데이터 검증 및 표현 - 크로스사이트스크립트

1)     크로스사이트스크립트
웹 페이지에 악의적인 스크립트를 포함시켜 사용자 측에서 실행되게 유도할 수 있다. 부적절한 스크립트가 수행될 경우 정보 유출 등의 공격을 유발할 수 있다.

n  안전한 코딩 기법
     문자열에서 <, >, &, , 등을 replace, replaceAll 등의 문자 변환 함수나 메소드를 사용하여 &lt;, &gt;, &amp;, &quot;로 치환한다.
     위험을 유발할 수 있는 태그들을 제거한 후 화면에 출력한다. <script>, <object>, <applet>, <element>, <embed>, <form>, <meta>, <iframe>, <frameset>, <frame>, <link>, <body>, <base>, Event Attributes (onload) 등을 replace, replaceAll을 이용하여 제거 또는 치환한다.



1.   // 외부의 입력값에 포함된 태그 제거
2.   private String htmlTagRemove(String content) {  
3.       String result = new String(content);  
4.       result = result.replaceAll("<(s|S)(c|C)(r|R)(i|I)(p|P)(t|T)[^>]*>[^<]*</(s|S)(c|C)(r|R)(i|I)(p|P)(t|T)>"""); // <script>  
5.       result = result.replaceAll("<(o|O)(b|B)(j|J)(e|E)(c|C)(t|T)[^>]*>[^<]*</(o|O)(b|B)(j|J)(e|E)(c|C)(t|T)>"""); // <object>  
6.       result = result.replaceAll("<(e|E)(m|M)(b|B)(e|E)(d|D)[^>]*>[^<]*</(e|E)(m|M)(b|B)(e|E)(d|D)>"""); // <embed>  
7.       result = result.replaceAll("<(f|F)(o|O)(r|R)(m|M)[^>]*>[^<]*</<(f|F)(o|O)(r|R)(m|M)>"""); // <form>  
8.       result = result.replaceAll("<(m|M)(e|E)(t|T)(a|A)[^>]*>[^<]*</(m|M)(e|E)(t|T)(a|A)>"""); // <meta>  
9.       result = result.replaceAll("<(i|I)(f|F)(r|R)(a|A)(m|M)(e|E)[^>]*>[^<]*</(i|I)(f|F)(r|R)(a|A)(m|M)(e|E)>"""); // <iframe>  
10.      result = result.replaceAll("<(f|F)(r|R)(a|A)(m|M)(e|E)(s|S)(e|E)(t|T)[^>]*>[^<]*</(f|F)(r|R)(a|A)(m|M)(e|E)(s|S)(e|E)(t|T)>"""); // <frameset>  
11.      result = result.replaceAll("<(f|F)(r|R)(a|A)(m|M)(e|E)[^>]*>[^<]*</(f|F)(r|R)(a|A)(m|M)(e|E)>"""); // <frame>  
12.      result = result.replaceAll("<(l|L)(i|I)(n|N)(k|K)[^>]*>[^<]*</(l|L)(i|I)(n|N)(k|K)>"""); // <link>  
13.      result = result.replaceAll("<(b|B)(o|O)(d|D)(y|Y)[^>]*>[^<]*</(b|B)(o|O)(d|D)(y|Y)>"""); // <body>  
14.      result = result.replaceAll("<(b|B)(a|A)(s|S)(e|E)[^>]*>[^<]*</(b|B)(a|A)(s|S)(e|E)>"""); // <base>  
15.      result = result.replaceAll("<(e|E)(l|L)(e|E)(m|M)(e|E)(n|N)(t|T)[^>]*>[^<]*</(e|E)(l|L)(e|E)(m|M)(e|E)(n|N)(t|T)>"""); // <element>  
16.            
17.      return result;  
18.  }  
19.        
20.  // 외부의 입력값에 대한 검증   
21.  private String verifyString(String content) {  
22.      String result = new String(content);  
23.        
24.      result = result.replaceAll("&""");  
25.      result = result.replaceAll("#""");  
26.      result = result.replaceAll("<""<");  
27.      result = result.replaceAll("\\)"")");  
28.      result = result.replaceAll(">"">");  
29.      result = result.replaceAll("\\(""(");  
30.      result = result.replaceAll("\"""");  
31.      result = result.replaceAll("/""");  
32.      result = result.replaceAll("\\\\", "");  
33.      result = result.replaceAll("'""");  
34.      result = result.replaceAll("\\+""");  
35.      result = result.replaceAll("-""");  
36.      result = result.replaceAll(":""");  
37.      result = result.replaceAll(";""");  
38.      result = result.replaceAll("=""");  
39.        
40.      return result;  
41.  }  

댓글 없음:

댓글 쓰기