2009-09-12 3 views
9

나는 Django 형식의 텍스트 영역에 대해 TinyMCE 편집기를 사용하고 있습니다.Django에서 안전한 텍스트 필터 사용하기

이제 리치 텍스트를 다시 사용자에게 표시하기 위해 브라우저에 HTML 서식있는 텍스트를 표시 할 수 있도록 장고 템플릿의 "안전한"필터를 사용해야합니다. 한다고 가정 자바 스크립트가 사용자의 브라우저에서 사용할 수 없습니다

는 TinyMCE에로드되지 않으며 사용자는 텍스트 영역 필드에서 <script> 또는 다른 XSS 태그를 전달할 수 있습니다. 이러한 HTML은 사용자에게 다시 표시하는 것이 안전하지 않습니다.

TinyMCE에서 제공되지 않는 안전하지 않은 HTML 텍스트는 어떻게 처리합니까?

답변

10

JavaScript는 사용하지 않는 브라우저뿐만 아니라 원시 HTML을 염두에 두어야합니다. 서버의 보안을 고려할 때 브라우저에서 수행 한 작업을 무시하고 서버가 받아들이는 작업과 수행되는 작업을 검토해야합니다. 서버는 HTML을 받아들이고 페이지에 표시합니다. 이것은 안전하지 않습니다.

TinyMce가 HTML을 인용한다는 사실은 거짓 보안입니다. 서버는 받아 들일 수있는 것을 신뢰합니다.

위험한 구조물을 제거하기 위해 도착한 HTML을 처리하는 것이 해결책입니다. 이것은 복잡한 문제입니다. XSS Cheat Sheet을 살펴보면 문제를 일으킬 수있는 다양한 입력을 볼 수 있습니다.

lxml에는 HTML : http://lxml.de/lxmlhtml.html#cleaning-up-html을 지우는 기능이 있지만 사용하지 않았으므로 품질을 보증 할 수 없습니다.

+1

XSS 치트 시트는 HTML 정리 루틴을 구현하는 것이 왜 쓸데없는 과정인지 보여주는 좋은 예입니다. whitelisting html 태그는이를 완전히 피할 수있는 유일한 방법입니다. –

+0

+1 멋진 링크.나는 나의 미래의 애플 리케이션이 이것에 대한 구멍이 적을 것이라고 생각한다. 고맙습니다. –

3

좋은 답변이 아닙니다. TinyMCE는 HTML을 생성하고 django의 자동 이스케이프는 특히 HTML을 제거합니다.

이 문제에 대한 전통적인 해결책은 사용자 입력면 (bbcode, markdown 등)에 HTML 태그가 아닌 일부 언어를 사용하거나 제한된 수의 HTML 태그를 허용하는 것입니다. TinyMCE/HTML은 일반적으로 다소 신뢰할 수있는 사용자에게만 적합한 입력 솔루션입니다.

화이트리스트 접근 방식은 보안 허점없이 구현하기 까다 롭습니다. 당신이하고 싶지 않은 한 가지는 단지 "나쁜"태그를 탐지하는 것입니다 - 당신은 가장자리의 경우를 놓칠 것입니다.

7

템플릿 필터 "removetags"을 사용하고 '스크립트'만 제거하면됩니다.

+4

'{{value | removetags : ""| safe}}'이것은 완벽하게 작동합니다. – Glycerine

+4

제발 그렇게하지 마십시오. 공격자가'

관련 문제