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

[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


분류 제목
filters Jinja - select() 필터 - 지정 테스트 통과한 요소만 필터링 (= select필터 = 실렉트필터…
filters Jinja - selectattr() 필터 - 지정 속성에 대한 테스트 통과한 아이템만 필터링 (= sele…
filters Jinja - slice() 필터 - 집합을 지정 개수로 쪼개기 (= slice필터 = 슬라이스필터) ※ 지…
filters Jinja - sort() 필터 ★ - 정렬 (= sort필터 = 소트필터) ※ 오름차순/내림차순
filters Jinja - string() 필터 - 문자열로 변환 (= string필터 = 스트링필터)
filters Jinja - striptags() 필터 ★ - 태그 제거 (= striptags필터 = 스트립태그스필터)
filters Jinja - sum() 필터 - (합계/합산/총합/총계) 구하기 (= sum필터 = 섬필터)
filters Jinja - title() 필터 - 각 단어의 첫글자를 대문자로 나머지는 소문자로 변환. (= title필…
filters Jinja - tojson() 필터 - JSON 문자열로 직렬화 (= tojson필터 = 투제이슨필터)
filters Jinja - truncate() 필터 - 문자열을 지정 길이로 자르기 (= truncate필터 = 트런케이…
filters Jinja - unique() 필터 - 고유 아이템으로 구성된 반복자 반환 (= unique필터 = 유니크필…
filters Jinja - upper() 필터 - 대문자로 변환 (= upper필터 = 어퍼필터) ※ 문자열 전체를 대문…
filters Jinja - urlencode() 필터 - URL 주소나 또는 쿼리에 적합한 문자열로 변환 (= urlen…
filters Jinja - urlize() 필터 ★ - 텍스트 URL을 클릭 가능한 링크로 변환 적용 (= urlize필…
filters Jinja - wordcount() 필터 - 문자열의 단어 개수 세기 (= wordcount필터 = 워드카운…
filters Jinja - wordwrap() 필터 - 문자열을 지정 길이 단위로 쪼개기 (= wordwrap필터 = 워…
filters Jinja - xmlattr() 필터 - dict의 아이템 기반으로 SGML/XML 속성 문자열 생성 (= …
tests Jinja - boolean() 테스트 - boolean 타입인지 체크 (= boolean테스트 = 불리언테…
tests Jinja - callable() 테스트 - 호출 가능한지 체크 (= callable테스트 = 콜러블테스트)
tests Jinja - defined() 테스트 ★ - 변수 정의되었는지 여부 체크 (= defined테스트 = 디파…
6/9
목록
찾아주셔서 감사합니다. Since 2012