티스토리 뷰
시판 내용에서 HTML태그의 허용은 여러가지 문제를 야기시킨다.
특히나 <table>태그를 사용해서 레이아웃을 잡은 디자인일 경우 게시물 내용중에
</td>,</table>등이 잘못 들어갈 경우 게시물 내용은 처참하게 깨지게 되는 결과를 초래하게 된다.
<table>태그가 아닌 <div>레이아웃일지라도 </div>를 잘못 넣게 되면 역시 같은 문제가 발생한다.
또한 <script>,<style>등을 허용했을 경우는 뒷감당하기 힘들어질 수가 있다.
한술 더떠 이런 취약점을 이용한 게시판 테러는 서버 다운이나 정보유출등의 심각한 문제까지 발생할 수가 있다.
C#에서는 Server.HtmlEncoding()를 제공하기 때문에 게시물 내용중에 포함된
<,>등의 HTML특수문자를 간단하게 처리할 수 있다.
그렇지만, HTML태그가 전혀 허용되지 않은 게시물은 삭막하기 이를데 없을뿐더러
웹에디터를 거의 대부분 사용하는 요즘은 HTML이 막힌 게시판은 찾아보기조차 힘들다.
그렇다면 태그도 허용하고 테러도 막을 수 있는 방법은 없는 것일까?
간단하게 자주 사용되는 특정 HTML태그만 허용하고 나머지는 허용하지 않게 하면 된다.
C#에서 정규식을 이용해 비교적 간단하게 처리할 수 있으니 참고하길 바란다.
(말이 간단하지 정규식 한줄 짜는데 무려 3시간이나 허비했다 ㅜㅜ)
----------C#용-------------------------------------------------------
//HTML 태그를 모두 제거
public static string StripHTMLTags(string str)
{
return System.Text.RegularExpressions.Regex.Replace(str, @"<(.|\n)*?>", String.Empty);
}
//HTML 태그를 모두 특수문자 인코딩으로 치환
public static string HTMLEncode(string str)
{
return System.Web.HttpContext.Current.Server.HtmlEncode(str);
}
//<,>를 <,>로 모두 치환
public static string ReplaceHTMLSpecialChars(string str)
{
return System.Text.RegularExpressions.Regex.Replace(str, @"<([^<>]+)?>", "<$1>");
}
//허용한 HTML 태그를 제외하고 <,>를 <,>로 치환
public static string ReplaceHTMLSpecialChars(string str, string strAllowTag)
{
string pattern = @"<(\/?)(?!\/####)([^<|>]+)?>";
string substitute = "<$1$2>";
string[] allowTags = strAllowTag.Split(',');
StringBuilder buffer = new StringBuilder();
for (int i = 0; i < allowTags.Length; i++)
{
buffer.Append("|" + allowTags[i].Trim() + @"(?!\w)");
}
pattern = pattern.Replace("####", buffer.ToString());
return System.Text.RegularExpressions.Regex.Replace(str, pattern, substitute);
}
//HTML 부분허용 사용 예
string text = "<h3 style=\"background-color:#ff0;\">Test</h3><div><p><strong style=\"color:red;\"><a href=\"test.aspx\"><b>aabbcc</b></a><br /></strong></p><span style=\"color:blue\">xxx</span><pre>test</pre></div>";
text = ReplaceHTMLSpecialChars(text, "b,span"); //<b>,<span> 태그만 허용
//예제의 결과를 찍어보면 b랑 span만 먹혀 있고, 나머지는 태그가 그대로 보일 것이다.
Response.Write(text);
----------------java 용--------------------------------------------------
//HTML 부분허용 사용 예
String text = "<h3 style=\"background-color:#ff0;\">Test</h3><div><p><strong style=\"color:red;\"><a href=\"test.aspx\"><b>aabbcc</b></a><br /></strong></p><span style=\"color:blue\">xxx</span><pre>test</pre></div>";
System.out.println(ReplaceHTMLSpecialChars(text,"h3,strong"));
//허용한 HTML 태그를 제외하고 <,>를 <,>로 치환
public static String ReplaceHTMLSpecialChars(String str, String strAllowTag)
{
String pattern = "<(/?)(?!/####)([^<|>]+)?>";
String substitute = "<$1$2>";
String[] allowTags = strAllowTag.split(",");
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < allowTags.length; i++)
{
buffer.append("|" + allowTags[i].trim() + "(?!w)");
}
pattern = pattern.replaceAll("####", buffer.toString());
String returnstr = str.replaceAll(pattern, substitute);
return returnstr;
}
'program' 카테고리의 다른 글
Java Code Convention (0) | 2013.10.02 |
---|---|
Java/자바/정규식] 대소문자 구분 없이 문자열 바꾸기/치환; Replace String (0) | 2013.08.27 |
웹 게임 서버 구성도 (0) | 2013.07.26 |
우분투에서 NAS 마운트하기 (네트워크드라이브) (0) | 2013.07.24 |
Apache Struts2 보안취약점을 이용한 원격 중요정보 유출 공지 (0) | 2013.07.22 |