검색기능을 구현할때,
폼값을 유지해야 할때 특수 기호에 대한 문제가 발생한다
특히 문제가 되는게 아래 5개에 대한 특수 기호.

< > " ' \


Why?
<> 의 경우는 <script></script> 형태로 자바스크립트를 사용해서 쿠키를 빼돌리거나 그러는
크로스 사이트 스크립트(XSS : Cross-Site Script)의 문제가 발생되고 (파란색글씨)
" ' \ 의 경우는 폼의 input박스에 유지할때 아래와 같은 붉은색 글씨때문에 폼이 깨져버린다.

<input type="text" name="keyword" value="<script>alert('바보');</script>" />                <-- 이러면 자바스크립트가 실행가능함
<input type="text" name="keyword" value="한국인"" />                                                <-- "가 괄호가 닫힌걸로 인식됨
<input type="text" name="keyword" value='한국인'' />                                                <-- ' 가 괄호가 닫힌걸로 인식됨
<input type="text" name="keyword" value="한국인\" />                                              <-- 가끔 문제가됨


How?
포털사이트를 분석해보니
위의 특수기호를 코드값형태로 변환해서 쓰고 있었고, 그렇게 해결하면됨.
아래 적은 메소드를 추가해주고나서 다음과 같이 쓰면됨

1. 실제 자바로직상에서는
<%
    String keyword = JmcUtil.decodeHtmlCode(request.getParameter("keyword"));
%>

2. html코드상에서 출력할때는 아래와 같이 쓰면됨
<input type="text" name="keyword" value=<%JmcUtil.encodeHtmlCode(keyword)%>


JavaCode

public class JmcUtil {

 /********************************************
  * 키워드에서 문제가되는 특수기호를 코드값으로 변환함
  * @param str
  * @return
  */

 public static String encodeHtmlCode(String str)
 {
  String result = str;
  final String []values = {">","<","\"","'","\\\\"};
  final String []codes  = {"&#062;","&#060","&quot;","&#039;","&#092;"};
  final int count = values.length>codes.length?codes.length:values.length;
  for(int i=0; i<count; i++)
  {
   if (result == null) break;
   
   result = result.replaceAll("["+values[i]+"]", codes[i]);
  }
  
  return result;
 }
 
 /**********************************************
  * 키워드에서 특수기호들을 원래 기호로 복호화함
  * @param str
  * @return
  */

 public static String decodeHtmlCode(String str)
 {
  String result = str;
  final String []values = {">","<","\"","'","\\\\"};
  final String []codes  = {"&#062;","&#060","&quot;","&#039;","&#092;"};
  final int count = values.length>codes.length?codes.length:values.length;
  for(int i=0; i<count; i++)
  {
   if (result == null) break;
   
   result = result.replaceAll(codes[i], values[i]);
  }
  
  return result;
 }

}//END class




 

+ Recent posts