CodeSampleX

샘플

jinja2 3.1.6: Stop jinja2 rendering user input as raw HTML — autoescape is OFF by default

검증된 샘플 — pypi jinja2 3.1.6: Stop jinja2 rendering user input as raw HTML — autoescape is OFF by default. python 3.12 · linux alpine/x64 · docker에서 contract를…

sha256:e61a843a67774f86f1ec19733f21178bacff5a4876143ca15e394e7228586c1e

이 네트워크가 제공하는 것은 하나입니다. 빌드되는 샘플. 샌드박스에서 돌리고 서명된 영수증을 보관합니다. 등급을 매기지 않고 무엇도 보증하지 않습니다 — 같은 코드가 당신 환경에서 빌드되는지는 측정한 적이 없습니다. 통과한 계약 영수증을 낸 서로 다른 서명 키의 수입니다. 하나면 작성자 혼자이고, 둘 이상이면 다른 사람도 빌드했다는 뜻입니다. 키는 스스로 만드는 것이고 뒤에 등록된 신원이 없으므로, 세는 것은 사람이 아니라 키입니다. MIT-0

실행 증거

선언된 환경과 서명된 실행을 분리해 두었습니다. 이 샘플이 무엇을 어디서 실행했는지 그대로 볼 수 있습니다.

증거 기준
서명된 컨트랙트 통과
검증 영수증
3
빌드한 서명 키
3
선언된 환경 python 3.12 linux x64 python 3.12 python pip

검증 실행 환경

환경 컨트랙트 단계 실행일
python 3.12 · linux alpine/x64 · docker ed25519:a2ec939a4c60e243 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · python@1
2026-08-13
python 3.12 · linux alpine/x64 · docker ed25519:d91480838ac982c9 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · python@1
2026-08-17
python 3.12 · linux debian/x64 · docker ed25519:c1973797be207ac4 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · python@1python:3.12-slim@sha256:09f7da3bc104…
2026-09-07

케이스

FIX
목표
Stop jinja2 rendering user input as raw HTML — autoescape is OFF by default
패키지
심벌
  • Environment
  • autoescape
  • Markup
환경
python 3.12
생성일
2026-08-13T18:43:53Z

컨트랙트

  1. render a template with a bare Environment and show HTML is NOT escaped
  2. assert autoescape=True escapes the same input
  3. assert select_autoescape enables it for html but not txt
  4. assert Markup marks trusted HTML as safe even when escaping is on

파일

  • csx.json
  • requirements.txt
  • src/__init__.py
  • src/render.py
  • test/contract.py

소스 아티팩트 내려받기 (tar.gz)

소스

csx.json
{"case":{"caseId":"case:sha256:255a37fb451a5c4b6b2f574898789abf9bc8b0aa17e0bd775dc57b86056063d5","constraints":{"runtime":"python"},"contract":["render a template with a bare Environment and show HTML is NOT escaped","assert autoescape=True escapes the same input","assert select_autoescape enables it for html but not txt","assert Markup marks trusted HTML as safe even when escaping is on"],"goal":"Stop jinja2 rendering user input as raw HTML — autoescape is OFF by default","kind":"FIX","packages":["pkg:pypi/jinja2@3.1.6"],"schemaVersion":1,"symbols":["Environment","autoescape","Markup"]},"contractCommand":["python","test/contract.py"],"environment":{"arch":"x64","ecosystem":"pypi","executionContext":"python","language":"python","os":"linux","packageManager":"pip","runtime":"python","runtimeVersion":"3.12","schemaVersion":1},"license":"MIT-0","packages":["pkg:pypi/jinja2@3.1.6"],"schemaVersion":1,"symbols":["Environment","autoescape","Markup"],"verifierAdapter":"python@1"}
requirements.txt
jinja2==3.1.6
markupsafe==3.0.3
src/__init__.py
src/render.py
"""jinja2 escaping, which is off unless you turn it on."""

from jinja2 import Environment, select_autoescape
from markupsafe import Markup


def render(template, autoescape=False, **values):
    """Render a template string.

    jinja2's default Environment has autoescape=False. Flask turns it on for
    .html templates, which is why the same code is safe in a Flask app and
    an injection hole in a script that builds its own Environment. There is
    no warning either way — the output simply contains whatever was passed.
    """
    env = Environment(autoescape=autoescape)
    return env.from_string(template).render(**values)


def render_for(filename, template, **values):
    """Escape based on the file type, the way Flask does."""
    env = Environment(autoescape=select_autoescape(default_for_string=False))
    env.policies["ext.i18n.trimmed"] = False
    return env.from_string(template).render(**values)


def trusted(html):
    """Mark HTML as already-safe so escaping leaves it alone."""
    return Markup(html)
test/contract.py
import os
import sys

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from jinja2 import Environment, select_autoescape

from src.render import render, trusted

hostile = "<script>alert(1)</script>"

# The default: NOT escaped. This is the whole point of the sample.
plain = render("<p>{{ text }}</p>", text=hostile)
assert "<script>" in plain, plain

# Turned on, the same input is escaped.
safe = render("<p>{{ text }}</p>", autoescape=True, text=hostile)
assert "<script>" not in safe, safe
assert "&lt;script&gt;" in safe, safe

# select_autoescape keys off the template name, which is how Flask does it.
env = Environment(autoescape=select_autoescape(enabled_extensions=("html",)))
assert env.autoescape("page.html") is True
assert env.autoescape("message.txt") is False

# Markup is the escape hatch for HTML you actually trust.
kept = render("<p>{{ text }}</p>", autoescape=True, text=trusted("<b>bold</b>"))
assert "<b>bold</b>" in kept, kept

print("CONTRACT PASS: jinja2 escaped only when told to, and honoured Markup")

오리진 시더

anonymous