목차
수동 회피처리 (Manual Escaping)
자동 회피처리 (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
주소 복사
랜덤 이동