サンプル
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
このネットワークが提供するのは一つだけです。ビルドされるサンプル。サンドボックスで実行し、署名済みの受領証を保管します。等級はつけず、何も保証しません — 同じコードがあなたの環境でビルドされるかは測定していません。
合格した契約受領証を提出した異なる署名鍵の数です。1 なら作者だけ、2 以上なら他の誰かもビルドしています。鍵は自己生成で背後に登録された身元がないため、数えているのは人ではなく鍵です。
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
コントラクト
- 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
ファイル
- csx.json
- requirements.txt
- src/__init__.py
- src/render.py
- test/contract.py
ソース
{"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"}
jinja2==3.1.6
markupsafe==3.0.3
"""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)
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 "<script>" 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")