
DOMPurify - HTML, MathML 및 SVG를 위한 DOM 전용, 초고속, 매우 관대한 XSS 새니타이저. DOMPurify는 안전한 기본 설정으로 작동하지만, 다양한 구성 옵션과 훅을 제공합니다. 데모:
DOMPurify는 HTML, MathML, SVG를 위한 DOM 전용의 초고속이며 매우 관대한 XSS 새니타이저입니다.
사용법도 매우 간단하고 시작하기도 쉽습니다. DOMPurify는 2014년 2월에 시작되었으며, 그동안 버전 v3.4.15에 도달했습니다.
DOMPurify는 JavaScript로 실행되며 모든 최신 브라우저(Safari (10+), Opera (15+), Edge, Firefox, Chrome - 그리고 Blink, Gecko, WebKit을 사용하는 거의 모든 것)에서 작동합니다. MSIE나 기타 레거시 브라우저에서도 깨지지 않습니다. 그냥 아무것도 하지 않을 뿐입니다.
참고로 DOMPurify v2.5.9가 MSIE를 지원하는 최신 버전입니다. MSIE와 호환되는 중요한 보안 업데이트가 필요하면 2.x 브랜치를 사용하세요.
당사의 자동화된 테스트는 매 푸시마다 현재 엔진(Chromium, Firefox, WebKit을 Ubuntu, macOS, Windows 전반에서)의 9가지 브라우저/OS 조합을 커버하며, 별도의 매트릭스가 구형 엔진 스냅샷(대략 Chromium 110, Firefox 108, WebKit 16.4까지, 약 3년 전)에서도 스위트를 재실행하여 오래된 브라우저에서의 회귀도 잡아냅니다. 또한 jsdom에서 DOMPurify와 함께 Node.js v20, v22, v24, v25, v26을 실행합니다. 더 오래된 Node 버전도 작동하는 것으로 알려져 있지만, 뭐... 보장은 없습니다.
DOMPurify는 웹 공격과 XSS에 대한 방대한 배경을 가진 보안 전문가들이 작성했습니다. 걱정 마세요. 자세한 내용은 보안 목표 및 위협 모델도 읽어보시기 바랍니다. 꼭 읽어주세요. 정말로요. 그리고 잔혹한 세부 사항을 즐기신다면, 공격 클래스 및 우회 이력 페이지에서 DOMPurify가 방어하는 파서 변이, 네임스페이스, 클로버링, 템플릿 트릭을 정리해 두었습니다.
DOMPurify 프로젝트는 HTML Sanitizer API의 탄생에 영감을 주었으며, 이는 이미 많은 브라우저에서 제공되고 있습니다. 동일한 기능이 이제 WHATWG HTML 명세에서 직접 표준화되고 있습니다.
DOMPurify는 HTML을 정화하고 XSS 공격을 방지합니다. 예를 들어 지저분한 HTML로 가득 찬 문자열을 DOMPurify에 넣으면 깨끗한 HTML이 담긴 문자열을 반환합니다(다르게 구성하지 않은 경우). DOMPurify는 위험한 HTML을 포함하는 모든 것을 제거하여 XSS 공격과 기타 위험한 것들을 방지합니다. 또한 굉장히 빠릅니다. 브라우저가 제공하는 기술을 사용하여 XSS 필터로 만들어냅니다. 브라우저가 빠를수록 DOMPurify도 빨라집니다.
쉽습니다. 웹사이트에 DOMPurify를 포함하기만 하면 됩니다.
### 축소되고 테스트된 프로덕션 버전 사용하기 (소스 맵 제공)```html
<script type="text/javascript" src="dist/purify.min.js"></script>
그런 다음 다음 코드를 실행하여 문자열을 정제할 수 있습니다:```js const clean = DOMPurify.sanitize(dirty);
또는 Angular 같은 것으로 작업하는 것을 좋아한다면 이것도 좋습니다:```js
import DOMPurify from 'dompurify';
const clean = DOMPurify.sanitize('<b>hello there</b>');
결과 HTML은 innerHTML을 사용하여 DOM 요소에 쓰거나 document.write()를 사용하여 DOM에 쓸 수 있습니다. 이는 전적으로 사용자에게 달려 있습니다.
기본적으로 HTML, SVG 그리고 MathML을 허용한다는 점에 유의하세요. HTML만 필요한 경우(매우 일반적인 사용 사례일 수 있음) 다음과 같이 쉽게 설정할 수 있습니다:```js
const clean = DOMPurify.sanitize(dirty, { USE_PROFILES: { html: true } });
### 함정이 있을 가능성이 있나요?
음, 주의하세요. HTML을 _먼저_ 정화한 다음 _나중에_ 수정하면 **정화 효과를 무효화**하기 쉽습니다. 정화된 마크업을 정화 _이후에_ 다른 라이브러리에 전달한다면, 그 라이브러리가 자체적으로 HTML을 함부로 다루지 않는지 반드시 확인하세요. 안전한 사용법과 두 번 생각해봐야 할 태그/속성에 대해서는 [Security Goals & Threat Model](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model)을, 후처리와 마크업 컨텍스트 변경이 왜 정화를 무력화하는지에 대해서는 [Attack Classes & Bypass History](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History)를 참고하세요.
### 알겠습니다, 이해됐으니 넘어가죠
마크업을 정화한 후에는 `DOMPurify.removed` 속성을 살펴보고 어떤 요소와 속성이 제거되었는지 확인할 수도 있습니다. 이 속성을 **보안에 중요한 결정을 내리는 데 사용하지 마세요**. 이는 단지 호기심 많은 사람들을 위한 작은 도우미일 뿐입니다.
### 서버에서 DOMPurify 실행하기
DOMPurify는 기술적으로 Node.js와 함께 서버 측에서도 작동합니다. 우리의 지원은 [Node.js 릴리스 주기](https://nodejs.org/en/about/previous-releases)를 따르기 위해 노력합니다.
서버에서 DOMPurify를 실행하려면 DOM이 존재해야 하는데, 이는 아마 놀라운 일이 아닐 것입니다. 일반적으로 [jsdom](https://github.com/jsdom/jsdom)이 선택되는 도구이며, 우리는 최신 버전의 _jsdom_을 사용할 것을 **강력히 권장**합니다.
왜일까요? 구버전의 _jsdom_은 DOMPurify가 100% 올바르게 작동하더라도 XSS를 초래하는 방식으로 버그가 있는 것으로 알려져 있기 때문입니다. 예를 들어 _jsdom v19.0.0_에는 **알려진 공격 벡터**가 있으며 이는 _jsdom v20.0.0_에서 수정되었습니다. 따라서 _jsdom_을 최신 상태로 유지할 것을 정말로 권장합니다.
또한 [happy-dom](https://github.com/capricorn86/happy-dom)과 같은 도구가 존재하지만 현재로서는 **안전한 것으로 간주되지 않는다**는 점을 유의하세요. DOMPurify를 _happy-dom_과 결합하는 것은 현재 권장되지 않으며 XSS로 이어질 가능성이 높습니다. 선택한 서버 측 DOM이 왜 신뢰할 수 있는 컴퓨팅 기반의 일부인지에 대한 배경은 [Attack Classes & Bypass History](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History)를 참고하세요.
그 외에는 서버에서 DOMPurify를 사용해도 괜찮습니다. 아마도요. 이는 정말로 _jsdom_ 또는 서버 측에서 사용하는 DOM에 달려 있습니다. 이를 감수할 수 있다면, 다음과 같이 작동하게 할 수 있습니다:```bash
npm install dompurify
npm install jsdom
_jsdom_의 경우(최신 버전을 사용하세요), 다음이면 충분합니다:```js const createDOMPurify = require('dompurify'); const { JSDOM } = require('jsdom');
const window = new JSDOM('').window; const DOMPurify = createDOMPurify(window); const clean = DOMPurify.sanitize('hello there');
또는 import로 작업하는 것을 선호한다면, 이렇게 할 수도 있습니다:```js
import { JSDOM } from 'jsdom';
import DOMPurify from 'dompurify';
const window = new JSDOM('').window;
const purify = DOMPurify(window);
const clean = purify.sanitize('<b>hello there</b>');
특정 환경에서 작동시키는 데 문제가 있다면, 많은 사람들이 겪을 수 있는 문제를 해결해 주는 훌륭한 isomorphic-dompurify 프로젝트를 참고해 보세요.```bash npm install isomorphic-dompurify
## 주요 기능
- **다중 소스 수집**: GitHub, GitLab, 로컬 디렉터리, ZIP 아카이브, 개별 파일
- **지능형 분석**: 언어 감지, 프레임워크 식별, 의존성 추출
- **보안 스캐닝**: 시크릿 탐지, SAST 규칙, 의존성 취약점 검사
- **유연한 보고**: JSON, Markdown, HTML, SARIF 형식
- **CI/CD 통합**: GitHub Actions, GitLab CI, Jenkins, pre-commit 훅
- **확장 가능한 아키텍처**: 플러그인 시스템, 사용자 정의 규칙, API 액세스
## 설치
### 사전 요구 사항
- Python 3.9 이상
- Git (저장소 소스용)
- 선택 사항: Docker (컨테이너화된 배포용)
### pip 사용
```bash
pip install codescan
git clone https://github.com/example/codescan.git
cd codescan
pip install -e .
docker pull example/codescan:latest
docker run --rm -v $(pwd):/workspace example/codescan scan /workspace
# 로컬 디렉터리 스캔
codescan scan ./my-project