대중이 볼 수있는 사용자 생성 HTML 컨텐츠를 처리하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1608758

  •  05-07-2019
  •  | 
  •  

문제

내 웹 애플리케이션에서는 StackoverFlow와 유사한 공개 소비를 위해 사용자 생성 컨텐츠를 게시 할 수 있습니다.

이것을 전달하기위한 모범 사례는 무엇입니까?

사용자 생성 된 컨텐츠를 처리하기위한 현재 단계는 다음과 같습니다.

  1. 나는 사용한다 Markitup 사용자가 HTML을 쉽게 포맷 할 수 있도록합니다.

  2. 사용자가 변경 사항을 제출 한 후 HTML 소독제 (Bottem으로 스크롤) 그것은 흰색 목록 접근법을 사용합니다.

  3. 소독 프로세스가 사용자가 만든 컨텐츠를 제거한 경우 컨텐츠를 저장하지 않습니다. 그런 다음 경고 메시지로 수정 된 내용을 반환합니다. "감지 및 제거 된 일부 불법 콘텐츠 태그는 작업을 두 번 확인하고 다시 시도하십시오."

  4. 콘텐츠가 소독 프로세스를 깨끗하게 통과하면 RAW HTML 컨텐츠를 데이터베이스에 저장합니다.

  5. 클라이언트로 렌더링 할 때는 RAW HTML을 DB에서 페이지로 전달합니다.

도움이 되었습니까?

해결책

그것은 완전히 합리적인 접근법입니다. 일반적인 응용 분야의 경우 전적으로 충분합니다.

흰색으로 표시된 RAW HTML의 가장 까다로운 부분은 다음과 같습니다 style 속성 및 embed/object. 누군가가 CSS 스타일을 신뢰할 수없는 형식의 텍스트 블록 또는 임베디드 YouTube 비디오에 넣고 싶어하는 합법적 인 이유가 있습니다. 이 문제는 피드에서 가장 일반적으로 발생합니다. 피드 항목에 포함 된 임의의 텍스트 블록을 믿을 수는 없지만 CSS 또는 플래시 비디오를 강조하는 구문 (예 : CSS 또는 플래시 비디오)을 벗기고 싶지는 않습니다. 이는 콘텐츠를 근본적으로 변경하고 읽는 사람을 잠재적으로 혼동하기 때문입니다. CSS는 IE에서 행동과 같은 위험한 것들을 포함 할 수 있으므로 style 머무르는 속성 embed/object 화이트리스트 호스트 이름이 필요할 수 있습니다.

부록 :

최악의 경우 시나리오에서 HTML은 모든 것을 눈에 띄게 탈출하면 사용자 경험이 매우 저하 될 수 있습니다. HTML5 파서 중 하나를 사용하여 화이트리스트와 함께 DOM을 통과하는 것이 훨씬 낫습니다. 이것은 소독 된 출력을 사용자에게 제시하는 방법에있어 훨씬 유연합니다. 당신은 다음과 같은 일을 할 수 있습니다.

<div class="sanitized">
  <div class="notice">
    This was sanitized for security reasons.
  </div>
  <div class="raw"><pre>
    &lt;script&gt;alert("XSS!");&lt;/script&gt;
  </pre></div>
</div>

그런 다음 숨기십시오 .raw CSS가있는 물건을 사용하고 jQuery를 사용하여 클릭 핸들러를 .sanitized div 그 사이에 그 토글 .raw 그리고 .notice:

CSS :

.raw {
  display: none;
}

jQuery :

$('.sanitized').click(function() {
  $(this).find('.notice').toggle();
  $(this).find('.sanitized').toggle();
});

다른 팁

흰색 목록은 좋은 움직임입니다. 모든 블랙리스트 솔루션은 모든 것을 생각할 수 없기 때문에 필요한 것보다 더 많은 것을 통과하기 쉽습니다. 나는 블랙리스트 (예 : 코드 프로젝트)를 사용하는 몇 가지 아프지를 보았고, 그들이 모든 것을 잡을 수 있다면, 일반적으로 코드에서 문자를 교체하는 것과 같은 추가 문제가 발생하여 먼저 수동으로 복원하지 않고 사용할 수 없도록합니다. .

가장 안전한 방법은 다음과 같습니다.

  1. HTML은 모든 텍스트를 인코딩합니다.

  2. 허용되는 태그 및 속성 세트를 일치시키고 해독하십시오.

정규 표현식을 사용하면 각 오프닝 태그에 닫는 태그가있어서 구제되지 않은 태그가 페이지를 엉망으로 만들 수 없도록해야합니다.

10 줄의 코드 로이 작업을 수행 할 수 있어야하므로 연결된 코드는 지나치게 복잡해 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top