티스토리 뷰

시판 내용에서 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);
}

 

//<,>를 &lt;,&gt;로 모두 치환
public static string ReplaceHTMLSpecialChars(string str)
{
    return System.Text.RegularExpressions.Regex.Replace(str, @"<([^<>]+)?>""&lt;$1&gt;");
}

 

//허용한 HTML 태그를 제외하고 <,>를 &lt;,&gt;로 치환
public static string ReplaceHTMLSpecialChars(string str, string strAllowTag)
{
    string pattern = @"<(\/?)(?!\/####)([^<|>]+)?>";
    string substitute = "&lt;$1$2&gt;";
    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 태그를 제외하고 <,>를 &lt;,&gt;로 치환

public static String ReplaceHTMLSpecialChars(String str, String strAllowTag)

{

       String pattern = "<(/?)(?!/####)([^<|>]+)?>";

       String substitute = "&lt;$1$2&gt;";

       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;

}



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함