• 회원가입
  • 로그인
  • 구글아이디로 로그인

[template] Jinja - 템플릿 - HTML 회피 (Template - HTML Escaping) ※ e필터 = 이필터

목차
  1. 수동 회피처리 (Manual Escaping)
  2. 자동 회피처리 (Automatic Escaping)

 

템플릿에서 HTML을 생성할 때는 변수가 결과 HTML에 영향을 주는 문자를 포함할 수 있다는 위험이 항상 있음. 두 가지 접근 방법이 있음:

  • 각 변수를 수동으로 회피처리.
  • 기본적으로 모든 것을 자동으로 회피처리.


Jinja는 두 가지 모두를 지원함. 사용되는 것은 애플리케이션 설정에 따라 달라짐. 기본구성은 자동 회피처리 없음. (아래 여러 이유 때문에.)

  • 안전한 값 이외의 모든 것을 회피처리 시, Jinja가 HTML을 포함하지 않는 변수(예: 숫자, 부울)도 회피처리해 성능에 큰 영향 미칠 수 있음.
  • 변수의 안전성에 대한 정보는 매우 취약함. 안전한 값과 안전하지 않은 값을 강제 형변환하면 반환 값이 이중으로 회피처리 된 HTML이 될 수 있음.

 

수동 회피처리 (Manual Escaping)

 

  • 수동 이스케이핑 활성화 시, 변수 회피처리 하는 것은 사용자 몫임.
  • (>, <, &, ") 문자 중 하나라도 포함된 변수 존재 시, 해당 변수가 올바른 형식의 신뢰 가능한 HTML을 포함 안 하면 반드시 해당 변수를 회피처리 해야 함.
  • 변수를 수동 회피처리 하려면, 해당 변수 뒤에 |e 필터 추가. (예)  {{ user.username|e }}

 

 

자동 회피처리 (Automatic Escaping)

 

1.

자동 회피처리 활성화 된 경우, 모든 것이 기본적으로 이스케이핑되지만 명시적으로 안전한 것으로 표시된 값은 예외임. 변수와 표현식은 다음 중 하나에서 안전한 것으로 표시할 수 있음:

  • 애플리케이션에서 markupsafe.Markup 사용해 컨텍스트 사전에 표시.
  • 템플릿에서 |safe 필터를 사용.

 

2.

safe 표시된 문자열이 해당 표시를 이해 못하는 다른 Python 코드 통과 시 그 표시가 사라질 수 있음. 데이터가 언제 안전하게 표시되었는지와 템플릿에 도달하기 전에 어떻게 처리되었는지 확인 필요함.

 

3.

변수가 회피처리 되었으나 safe로 표시 안 되면 자동 회피처리가 여전히 진행되어 이중 회피처리 된 문자가 발생함. 이미 안전한 데이터이나 safe 표시 안 된 경우, 반드시 Markup으로 래핑하거나 |safe 필터를 사용해야 함.

 

4.

Jinja 함수(macros, super, self.BLOCKNAME)들은 항상 safe 표시된 템플릿 데이터를 반환함.

 

5.

자동 회피처리 있는 템플릿의 문자열 리터럴은 unsafe로 간주됨. (왜냐하면 고유 Python 문자열이 safe 하지 않기 때문임.) 

 

공식 매뉴얼: https://jinja.palletsprojects.com/en/3.1.x/templates/#working-with-automatic-escaping


분류 제목
tip Jinja - 팁과 요령 - 교대 행 (Tips and Tricks - Alternating Rows)
tip Jinja - 팁과 요령 - 활성 메뉴 항목 강조 표시 (Tips and Tricks - Highlighti…
tip Jinja - 팁과 요령 - 상위 루프에 액세스 (Tips and Tricks - Accessing the …
faq Jinja - FAQ - 왜 진자라고 불리는가?
faq Jinja - FAQ - 진자는 얼마나 빠른가요?
faq Jinja - FAQ - 템플릿에 로직을 넣는 것은 나쁜 생각이 아닌가?
faq Jinja - FAQ - HTML 이스케이프가 기본값이 아닌 이유는 무엇입니까?
filters Jinja - abs() 필터 - 절대값으로 변환. (= abs필터 = 앱스필터) ※ 숫자를 절대값으로 변경
filters Jinja - attr() 필터 - 객체의 속성 얻기. (= attr필터 = 어트르필터) ※ 속성만 조회
filters Jinja - batch() 필터 - 아이템 일괄처리. (= batch필터 = 배치필터) ※ for 반복문 …
filters Jinja - capitalize() 필터 - 첫글자만 대문자로 변환. (= capitalize필터 = 캐피…
filters Jinja - center() 필터 - 문자열 가운데 정렬/배치. (= center필터 = 센터필터)
filters Jinja - default() 필터 / d() 필터 - 변수가 정의 안 된 경우 기본값 출력. (= def…
filters Jinja - dictsort() 필터 - 딕셔너리 키 또는 값으로 정렬. (=dictsort필터 = 딕트소…
filters Jinja - escape() 필터 / e() 필터 ★ - HTML 태그를 HTML 실체값으로 변환. (= …
filters Jinja - filesizeformat() 필터 - 파일 크기를 사람이 읽을 수 있는 형식으로 변환. (=…
filters Jinja - first() 필터 - 시퀀스의 첫번째 아이템 반환. (= first필터 = 퍼스터필터) ※ …
filters Jinja - float() 필터 - 값을 부동소수로 변환. (= float필터 = 플로우트필터) ※ ※ 문…
filters Jinja - forceescape() 필터 ★ - 모든 특수문자를 HTML 회피처리. (= forceesc…
filters Jinja - format() 필터 - 문자열을 서식 문자열에 따라 변환. (= format필터 = 포맷필터…
4/9
목록
찾아주셔서 감사합니다. Since 2012