고객이 웹 사이트에서 리치 텍스트 편집을 요구하면 어떻게합니까?


18

우리 모두 알다시피, XSS 공격은 위험 하고 실제로 해내 기 쉽습니다 . ASP.NET MVC처럼 다양한 프레임 워크를 통해 HTML을 쉽게 인코딩 할 수 있습니다.

<%= Html.Encode("string"); %>

그러나 고객이 Microsoft Word 문서에서 직접 컨텐츠를 업로드 할 수 있어야하는 경우 어떻게됩니까?

시나리오는 다음과 같습니다. 사람들은 Microsoft Word의 컨텐츠를 WYSIWYG 편집기 (이 경우 tinyMCE ) 로 복사하여 붙여 넣을 수 있으며 해당 정보는 웹 페이지에 게시됩니다.

이 웹 사이트는 공개적이지만 해당 조직의 구성원 만 웹 페이지에 정보를 게시 할 수 있습니다.

이러한 요구 사항을 안전하게 처리하려면 어떻게해야합니까? 현재 '신뢰할 수있는'사용자 만 게시 할 수 있기 때문에 고객이 게시 한 내용에 대한 검사는 수행되지 않지만 계정에 해킹당하는 경우에는 특히 마음에 들지 않으며 추가로 잠그고 싶습니다.

내가 아는 유일한 개념적 방법은 이러한 요구 사항을 충족시키는 HTML 태그화이트리스트에 추가하여 통과시키는 것 입니다. 다른 방법이 있습니까? 그렇지 않은 경우 사용자가 데이터베이스에 입력을 임의의 형식으로 저장할 수 있지만 올바르게 인코딩되어 잘못된 태그가 제거 된 것만 표시하는 안전한 방법은 무엇입니까?

관련 질문

크로스 사이트 스크립팅 방지 (XSS)


니스는 여기 질문 - 유사 하나 though-입니다 stackoverflow.com/questions/445177/...
RichardOD

동의했다. 비슷하지만 혼동되는 질문 (질문을 찾기가 어렵습니다)이며 다른 방법이 있는지 구체적으로 묻지는 않습니다. 화이트리스트를 만들지 않고 HTML을 렌더링하는 다른 방법이 있다면 전부입니다. 이것을 처리하는 ASP.NET MVC View Engine이 있다면, 그것도 아는 것이 좋습니다.
George Stocker

비보안 관련 메모에서 태그 필터링은 사용자 인터페이스 관점에서 도움이 될 것입니다. 실수로 꺾쇠 괄호를 입력하고 탈출하는 것을 잊어 버리는 것은 매우 쉽습니다. 우리는 Word에서 복사하는 사용자에 대해 이야기하고 있기 때문에 나쁜 태그처럼 보이는 것을 잡아서 적절하게 인코딩하여 제대로 작동하도록하는 것이 좋습니다.

포인트 # 4와 관련하여 : 여전히 문제입니다. 결국 대부분의 핵은 내부 작업입니다. 특정 편집기의 경우 FreeTextBox를 사용하여 행운을 얻었 지만 MVC와 같은 요구 사항에 얼마나 잘 부합하는지 말할 수는 없습니다.
Joel Coehoorn

1
@gnat 감사합니다; 편집했습니다. 내 질문에 일종의 칼이 주목을 받았다. 세 개의 다운 보트가 빠른 연속으로 보호되며 편집 및 보호 요청이 수행됩니다.
George Stocker

답변:


8

(개발자로서 당신을 위해) 가장 쉬운 방법은 많은 변화 중 하나 구현하는 아마 마크 다운을 예를 들어, Markdown.NET , 또는 더 나은 (IMHO)을 대량 살상 무기 편집기를 .

그런 다음 사용자는 간단한 HTML을 붙여 넣을 수는 있지만 위험하지는 않으며 입력하기 전에 입력 한 데이터를 미리보고 스크럽을 바로 잡을 수 있습니다 ...


StackOverflow는 WMD 구문 없이도 사용자 정의 편집기를 사용한다고 생각합니다.
Jon

1
StackOverflow는 실제로 WMD를 사용합니다. blog.stackoverflow.com/2008/05/… stackoverflow.com/questions/98852/…

WMD 구문은 무엇을 의미합니까? 내가 알 수있는 한 모든 WMD 구문이 작동합니다. 그리고 아직 작동하지 않는 것을 찾지 못했습니다 ...

2
Markdown을 사용할 때의 문제점은 markdown이 임의의 HTML을 허용한다는 것입니다. 따라서 그 자체로는 해결책이 아닙니다.
George Stocker

7

화이트리스트는 실제로 사용자가 직접 또는 리치 텍스트 편집기를 사용하여 HTML을 입력 할 수있게 할 때 XSS 공격을 방지하는 가장 좋은 방법입니다.

다른 질문에 대해 :

화이트리스트 기능이 포함 된 WYSIWYG 편집기가 있습니까?

나는 이것이 효과가 있다고 생각하지 않습니다. 이를 위해서는 서버 측 코드가 필요하며 RTE는 클라이언트에서 실행됩니다.

TinyMCE는 원하는 경우 태그를 필터링하지만 브라우저에서 발생하므로 태그를 신뢰할 수 없습니다. extended_valid_elements를 참조하십시오 . TinyMCE (Moxie)도 화이트리스트를 제안 합니다 . 여기를 참조 하십시오 .

'비공개 게시'에만 해당되므로 걱정해야합니까?

특별한 이유가없는 한 (매우 드물지 않은 경우) 항상 HTML을 필터링해야합니다. 몇 가지 이유 : a) 오늘날 내부 사용자를위한 기능, 아마도 내일 공개를위한 기능 b) 무단 액세스는 영향을 덜받습니다

데이터베이스에 어떤 형식 으로든 저장할 수있는 가장 좋은 방법이지만 올바르게 인코딩되고 잘못된 태그가 제거 된 것만 표시합니까?

그것이 내가 선호하는 방식입니다. 여러 가지 이유로 데이터베이스에 삽입하기 전에 사용자 입력을 변경하고 싶지 않습니다.


-1

나는 똑같은 일을하고 있습니다. TinyMCE를 사용하고 Word 문서에서 붙여 넣기를 허용하고 있습니다. 사이트를 관리하는 특정 사람 만 관리 영역을 통해이 작업을 수행 할 수 있습니다. 이것은 ASP.Net Membership에 의해 보호됩니다. HTML.Encode가 공개 사이트로 보내질 때 간단합니다.

데이터베이스에 넣기 전에 원하는 코드를 사용할 수 있지만 어떤 영향을 줄지 확실하지 않은 경우 아래 코드를 사용할 수 있습니다. 화이트리스트와 함께 가야 할 수도 있습니다.

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }

<script> alert ( "hey") </ script>와 같은 텍스트를 저장하고 Html.Encode (<script> alert ( "hey") </ script>)를 수행하면 페이지가 실행되지 않도록 인쇄됩니다. 경고
Jon

화이트리스트를 사용하지 않고 그대로 저장합니다. 위의 기능이 도움이 될 수는 있지만 어떤 영향을 미치는지 알 수 없습니다. 당신이 결정한 것을 알고 싶습니다. 내 게시물이 부정적인 것으로 표시되는 이유는 무엇입니까?
Jon

1
소프트웨어가 수행하는 방식이 매우 순진한 구현이기 때문입니다. 구현을 둘러싼 모든 종류의 트릭이 있습니다.
George Stocker

4
화이트리스트는 좋은 생각이지만 방법은 그렇지 않습니다. 정규식은 HTML에서 난독 처리 될 수 있으므로 텍스트에서 태그를 감지하는 신뢰할 수있는 방법이 아닙니다. HTML Agility Pack과 같은 라이브러리를 사용하는 것이 훨씬 좋습니다.
Noldorin

-1

한 가지 옵션은 .NET 용 HTML 편집 컨트롤 (필자가 쓴) 일 수 있습니다.

.NET 용 WYSIWYM HTML 편집기입니다.이 HTML 편집기는 요소 를 제외한 HTML 요소의 하위 세트 만 지원 <script>하므로 화이트리스트 역할을합니다.

내부 용 (예 : 인트라넷 사이트) 인 경우 웹 페이지에 컨트롤을 포함시킬 수 있습니다 .

Word에서 붙여 넣기에 대한 지원을 통합하지 않았지만 그 방향으로 나아가는 구성 요소가 있습니다. Doc to HTML 변환기 ; 그래서 ASP.NET에서 Doc을 HTML로 변환하고 HTML을 편집기에 표시하는 데 사용할 수있는 빌딩 블록이 있습니다.


-2

내 IMHO는 공개 될 때까지 사용자를 계속 신뢰합니다.

글쎄, 당신의 요구를 달성 할 수있는 확실한 방법은 없습니다. 예를 들어 WYSIWYG 편집기는 URL (간접 사용 트랙, 불법 콘텐츠) 또는 텍스트 (불법 텍스트, 철자가 틀린 텍스트, 철자가 틀린 텍스트)가있는 이미지를 삽입하는 양식을 보호하지 못합니다.

내 견해는 사용자를 신뢰할 수 있으면 모든 것을 허용하고 위험한 마크 업이 있으면 오류를 방지하기 위해 사용자에게 경고하는 것입니다.

신뢰할 수없는 경우 일종의 특수 마크 업 (예 : 마크 다운)을 사용하십시오.

내 프로젝트에서 우리는 잠재적으로 위험한 콘텐츠에 특수 유형을 사용하고 해당 콘텐츠를 렌더링하고 수락하는 특수 방법을 사용합니다. 이 코드는 스레드 모델에서 높은 점수를 받았으며 매우주의를 기울였습니다 (예 : 각 변경은 두 개의 독립적 인 코더가 검토해야하며 포괄적 인 테스트 스위트 등이 있습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.