우리 모두 알다시피, XSS 공격은 위험 하고 실제로 해내 기 쉽습니다 . ASP.NET MVC처럼 다양한 프레임 워크를 통해 HTML을 쉽게 인코딩 할 수 있습니다.
<%= Html.Encode("string"); %>
그러나 고객이 Microsoft Word 문서에서 직접 컨텐츠를 업로드 할 수 있어야하는 경우 어떻게됩니까?
시나리오는 다음과 같습니다. 사람들은 Microsoft Word의 컨텐츠를 WYSIWYG 편집기 (이 경우 tinyMCE ) 로 복사하여 붙여 넣을 수 있으며 해당 정보는 웹 페이지에 게시됩니다.
이 웹 사이트는 공개적이지만 해당 조직의 구성원 만 웹 페이지에 정보를 게시 할 수 있습니다.
이러한 요구 사항을 안전하게 처리하려면 어떻게해야합니까? 현재 ‘신뢰할 수있는’사용자 만 게시 할 수 있기 때문에 고객이 게시 한 내용에 대한 검사는 수행되지 않지만 계정에 해킹당하는 경우에는 특히 마음에 들지 않으며 추가로 잠그고 싶습니다.
내가 아는 유일한 개념적 방법은 이러한 요구 사항을 충족시키는 HTML 태그 를 화이트리스트에 추가하여 통과시키는 것 입니다. 다른 방법이 있습니까? 그렇지 않은 경우 사용자가 데이터베이스에 입력을 임의의 형식으로 저장할 수 있지만 올바르게 인코딩되어 잘못된 태그가 제거 된 것만 표시하는 안전한 방법은 무엇입니까?
관련 질문
답변
(개발자로서 당신을 위해) 가장 쉬운 방법은 많은 변화 중 하나 구현하는 아마 마크 다운을 예를 들어, Markdown.NET , 또는 더 나은 (IMHO)을 대량 살상 무기 편집기를 .
그런 다음 사용자는 간단한 HTML을 붙여 넣을 수는 있지만 위험하지는 않으며 입력하기 전에 입력 한 데이터를 미리보고 스크럽을 바로 잡을 수 있습니다 …
답변
화이트리스트는 실제로 사용자가 직접 또는 리치 텍스트 편집기를 사용하여 HTML을 입력 할 수있게 할 때 XSS 공격을 방지하는 가장 좋은 방법입니다.
다른 질문에 대해 :
화이트리스트 기능이 포함 된 WYSIWYG 편집기가 있습니까?
나는 이것이 효과가 있다고 생각하지 않습니다. 이를 위해서는 서버 측 코드가 필요하며 RTE는 클라이언트에서 실행됩니다.
TinyMCE는 원하는 경우 태그를 필터링하지만 브라우저에서 발생하므로 태그를 신뢰할 수 없습니다. extended_valid_elements를 참조하십시오 . TinyMCE (Moxie)도 화이트리스트를 제안 합니다 . 여기를 참조 하십시오 .
‘비공개 게시’에만 해당되므로 걱정해야합니까?
특별한 이유가없는 한 (매우 드물지 않은 경우) 항상 HTML을 필터링해야합니다. 몇 가지 이유 : a) 오늘날 내부 사용자를위한 기능, 아마도 내일 공개를위한 기능 b) 무단 액세스는 영향을 덜받습니다
데이터베이스에 어떤 형식 으로든 저장할 수있는 가장 좋은 방법이지만 올바르게 인코딩되고 잘못된 태그가 제거 된 것만 표시합니까?
그것이 내가 선호하는 방식입니다. 여러 가지 이유로 데이터베이스에 삽입하기 전에 사용자 입력을 변경하고 싶지 않습니다.
답변
나는 똑같은 일을하고 있습니다. 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;
}
답변
한 가지 옵션은 .NET 용 HTML 편집 컨트롤 (필자가 쓴) 일 수 있습니다.
.NET 용 WYSIWYM HTML 편집기입니다.이 HTML 편집기는 요소 를 제외한 HTML 요소의 하위 세트 만 지원 <script>
하므로 화이트리스트 역할을합니다.
내부 용 (예 : 인트라넷 사이트) 인 경우 웹 페이지에 컨트롤을 포함시킬 수 있습니다 .
Word에서 붙여 넣기에 대한 지원을 통합하지 않았지만 그 방향으로 나아가는 구성 요소가 있습니다. Doc to HTML 변환기 ; 그래서 ASP.NET에서 Doc을 HTML로 변환하고 HTML을 편집기에 표시하는 데 사용할 수있는 빌딩 블록이 있습니다.
답변
내 IMHO는 공개 될 때까지 사용자를 계속 신뢰합니다.
글쎄, 당신의 요구를 달성 할 수있는 확실한 방법은 없습니다. 예를 들어 WYSIWYG 편집기는 URL (간접 사용 트랙, 불법 콘텐츠) 또는 텍스트 (불법 텍스트, 철자가 틀린 텍스트, 철자가 틀린 텍스트)가있는 이미지를 삽입하는 양식을 보호하지 못합니다.
내 견해는 사용자를 신뢰할 수 있으면 모든 것을 허용하고 위험한 마크 업이 있으면 오류를 방지하기 위해 사용자에게 경고하는 것입니다.
신뢰할 수없는 경우 일종의 특수 마크 업 (예 : 마크 다운)을 사용하십시오.
내 프로젝트에서 우리는 잠재적으로 위험한 콘텐츠에 특수 유형을 사용하고 해당 콘텐츠를 렌더링하고 수락하는 특수 방법을 사용합니다. 이 코드는 스레드 모델에서 높은 점수를 받았으며 매우주의를 기울였습니다 (예 : 각 변경은 두 개의 독립적 인 코더가 검토해야하며 포괄적 인 테스트 스위트 등이 있습니다).