검색기능을 구현할때,
폼값을 유지해야 할때 특수 기호에 대한 문제가 발생한다
특히 문제가 되는게 아래 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 = {">","<",""","'","\"};
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 = {">","<",""","'","\"};
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