Skip to content

보안

Handlebars는 템플릿과 데이터로 결과물을 렌더링하도록 설계되었습니다. 템플릿, 입력 데이터, 등록된 헬퍼, 부분 템플릿, 그리고 런타임 설정은 모두 애플리케이션의 보안 경계 일부로 취급해야 합니다.

브라우저에서 HTML 렌더링

기본적으로 Handlebars는 {{expression}}으로 렌더링되는 값을 HTML 이스케이프합니다. 이렇게 하면 HTML 마크업에 삽입된 텍스트가 HTML로 해석되는 것을 방지합니다.

handlebars
<p>{{comment}}</p>

신뢰할 수 없는 콘텐츠에는 트리플 스태시 표현식({{{expression}}})을 사용하거나 Handlebars.SafeString을 반환하지 마세요. 이는 이스케이프를 비활성화하며 크로스 사이트 스크립팅(XSS) 취약점을 만들 수 있습니다. 헬퍼가 HTML을 반환하는 경우 결과를 안전한 것으로 표시하기 전에 신뢰할 수 없는 모든 값을 이스케이프해야 합니다.

HTML 이스케이프는 컨텍스트별로 적용됩니다. 신뢰할 수 없는 데이터를 JavaScript, CSS, URL 또는 이벤트 핸들러 속성에서 안전하게 만들지는 않습니다. 템플릿으로 인라인 스크립트나 이벤트 핸들러를 생성하지 마세요. 정확한 출력 컨텍스트에 맞게 데이터를 검증하고 인코딩하며, CSS에 신뢰할 수 없는 값을 넣기 전에 허용 목록을 적용하세요.

URL

HTML 이스케이프는 href 또는 유사한 속성에서 사용할 때 javascript:...와 같은 URL의 실행을 막지 않습니다. 렌더링하기 전에 https와 같이 허용된 스키마의 허용 목록을 사용하여 사용자 제공 URL을 정화하세요.

콘텐츠 보안 정책

브라우저에서 Handlebars 출력을 렌더링할 때는 콘텐츠 보안 정책(CSP)을 사용하세요. 제한적인 CSP는 인라인 스크립트를 방지하고 스크립트, 스타일, 이미지 및 기타 리소스를 로드할 수 있는 출처를 제한하여 XSS 취약점의 영향을 줄일 수 있습니다. 브라우저에서 템플릿을 컴파일하려면 CSP의 'unsafe-eval'이 필요합니다. 이를 피하려면 사전 컴파일된 템플릿과 런타임 전용 빌드를 사용하세요. 'unsafe-inline'은 피하세요. CSP는 심층 방어 수단이며, 신뢰할 수 없는 콘텐츠의 이스케이프 및 정화를 대체하지 않습니다.

서버에서 템플릿 컴파일 및 렌더링

템플릿은 애플리케이션이 제공하는 헬퍼와 부분 템플릿을 호출할 수 있으며, 제공한 데이터를 렌더링합니다. 꼭 필요한 경우가 아니면 템플릿에 비밀 정보나 권한 있는 애플리케이션 객체에 대한 접근 권한을 부여하지 마세요. 렌더링 컨텍스트를 작게 유지하고, 동작이 좁고 명확하게 정의된 헬퍼를 사용하세요. 헬퍼는 인수를 검증해야 하며, 템플릿 입력을 임의의 파일, 네트워크, 데이터베이스 또는 명령 접근으로 바꾸면 안 됩니다.

Handlebars를 최신 상태로 유지하고 애플리케이션이 사용하는 런타임 옵션을 검토하세요. 프로토타입 속성 접근 제어를 완화하거나 allowCallsToHelperMissing을 활성화하지 마세요. 이러한 옵션은 템플릿 작성자가 템플릿에서 사용할 수 있는 객체를 통해 의도하지 않은 코드를 실행하도록 허용할 수 있습니다.

사용자가 제공한 템플릿

사용자 템플릿은 리소스 소비 측면에서 신뢰할 수 없는 프로그램입니다. 깊게 중첩된 템플릿, 반복되는 부분 템플릿 또는 대규모 반복을 수행하는 템플릿은 상당한 CPU, 메모리 또는 출력 공간을 소비할 수 있습니다. 템플릿이 임의의 JavaScript를 실행할 수 없더라도 서비스 거부를 일으킬 수 있습니다.

사용자가 템플릿을 제출할 수 있다면 처리 전후로 제한을 적용하세요.

  • 애플리케이션에서 템플릿 크기, 중첩 깊이, 부분 템플릿 재귀, 입력 크기 및 렌더링된 출력 크기를 제한하세요.
  • Handlebars는 반복 횟수를 제한하지 않으므로 템플릿에 전달되는 배열과 객체의 크기를 제한하세요.
  • 컴파일과 렌더링에 요청 시간 제한 및 리소스 할당량을 적용하세요.
  • 템플릿 제출 및 렌더링 엔드포인트에 속도 제한을 적용하세요.

사용자 제공 템플릿은 엄격한 CPU, 메모리, 파일 시스템 및 네트워크 제한이 적용된 별도의 프로세스나 컨테이너와 같은 격리된 샌드박스에서 컴파일하고 렌더링하세요. Handlebars만을 보안 샌드박스로 신뢰하지 마세요. 이 격리된 환경에서는 안전한 헬퍼와 부분 템플릿의 허용 목록만 노출하고, 최소한의 데이터 객체만 전달하며, 애플리케이션 자격 증명이나 호스트 접근을 제공하지 마세요.

AST 컴파일

신뢰할 수 있는 템플릿 소스에서 Handlebars가 생성한 AST만 컴파일하세요. 사용자가 제공했거나 그 외에 신뢰할 수 없는 AST를 컴파일하는 일은 본질적으로 안전하지 않으므로 절대 해서는 안 됩니다. 조작된 AST는 컴파일러의 가정을 깨뜨리고 원래 템플릿 언어가 허용하지 않는 동작을 하는 실행 가능한 JavaScript를 생성할 수 있습니다.

MIT 라이센스