2010-01-20 4 views
1

여기에서 내가 뭘하고있는 데 문제가 있습니까? 이와 같은 것을 처리하는 것은 이번이 처음이며, 모든 위험을 다른 방법으로 이해하고 있는지 확인하고 싶습니다.C#에서 WMD 제어를 사용하여 XSS를 허용하지 않음

사용자 입력을 위해 WMD를 사용하고 있으며 리터럴 컨트롤로 표시하고 있습니다. 가 편집 할 때문에 한 번 나는 HTML이 아닌 마크 다운,

input = Server.HTMLEncode(stringThatComesFromWMDTextArea) 

를 저장하고 다음 I 사용자가 사용할 수 있도록하려는 태그에 대해 다음과 같은 것을 실행됩니다 들어갔다.

public static string EncodeAndWhitelist(string html) 
{ 
    string[] whiteList = { "b", "i", "strong", "img", "ul", "li" }; 
    string encodedHTML = HttpUtility.HtmlEncode(html); 
    foreach (string wl in whiteList) 
     encodedHTML = encodedHTML.Replace("&lt;" + wl + "&gt;", "<" + wl + ">").Replace("&lt;/" + wl + "&gt;", "</" + wl + ">"); 
    return encodedHTML; 
} 
  1. 내가 나를 XSS으로부터 보호 유지 여기서 뭐하는거야 것 : 여기

    // Unescape whitelisted tags. 
    string output = input.Replace("&lt;b&gt;", "<b>").Replace("&lt;/b&gt;", "</b>") 
            .Replace("&lt;i&gt;", "<i>").Replace("&lt;/i&gt;", "</i>"); 
    

    편집 내가 현재 무엇을하고 무엇인가?

  2. 해야 할 다른 고려 사항이 있습니까?
  3. 화이트리스트에 정상적인 태그의 좋은 목록이 있습니까?
+0

"<img>"을 "src"속성에 사용할 수 없으므로 해당 코드는 "IMG"태그에서 작동하지 않습니다. – David

답변

2

귀하의 요구 사항이 실제로 단순한 문자열 교체를 수행 할 수있는 기본 사항 인 경우 XSS에 대해 '안전'합니다. 그러나 과 <b>이 잘못 중첩되거나 닫히지 않아 콘텐츠가 삽입되는 페이지가 엉망이 될 수있는 부적절한 콘텐츠를 제출할 수 있습니다.

하지만이 정도면 충분하지 않습니다. 예 : 현재 <a href="..."> 또는 <img src="..." />은 허용되지 않습니다. 속성 값을 가진 이러한 마크 업이나 다른 마크 업을 허용하려면 훨씬 더 많은 작업이 필요합니다. 그런 다음 regex를 사용하여 접근 할 수는 있지만 이미 대체 된 내용의 우연한 중첩 및 대체에 대한 끝없는 문제를 일으키며 정규 표현식이 HTML을 구문 분석 할 수없는 방식으로 볼 수 있습니다.

두 가지 문제를 모두 해결하려면 입력에 [X] [HT] ML 파서를 사용하고 알려진 요소와 속성을 제외하고 DOM을 걷고 마지막으로 [X ] HTML. 결과는 올바른 형식으로 보장되며 안전한 콘텐츠 만 포함합니다.

+0

그래서 좀 더 견고한 것을 원한다고 가정 할 때 당신이 언급 한 파서? HTML Agility Pack이 처리 할 수 ​​있습니까? 이미이 모든 것을 수행하는 것이 없습니까? – Jason

+0

예, HTML 민첩성 팩은 좋은 선택입니다. 일단 DOM을 구문 분석하면 비교적 간단한 연습으로 DOM 트리에서 잘 알려진 엘리먼트/애트리뷰트를 제외한 모든 엘리먼트/엘리먼트를 제거하는 재귀 함수.'href' /'src'/etc를 허용하면'http' /'https'와 같은 잘 알려진 스킴에 대한 URL을 체크해야한다. 'javascript :'URL 등을 통한 주입을 피하기 위해서입니다. – bobince