Sie können dies mit Jinjas tojson
Filter tun , der
Gibt eine Struktur an JSON aus, sodass die Verwendung in <script>
Tags [und] an jeder Stelle in HTML sicher ist, mit Ausnahme von Attributen in doppelten Anführungszeichen.
Schreiben Sie beispielsweise in Ihrem Python:
some_template.render(list_of_items=list_of_items)
... oder im Kontext eines Flask-Endpunkts:
return render_template('your_template.html', list_of_items=list_of_items)
Schreiben Sie dann in Ihre Vorlage Folgendes:
{% for item in list_of_items %}
<span onclick='somefunction({{item | tojson}})'>{{item}}</span><br>
{% endfor %}
(Beachten Sie, dass das onclick
Attribut ist Single -quoted. Dies da notwendig ist , |tojson
entkommt '
Zeichen aber nicht"
Zeichen in seinem Ausgang, was bedeutet , dass es sicher in einfachen Anführungszeichen verwendet werden können HTML - Attribute , aber nicht in doppelten Anführungszeichen diejenigen.)
Oder list_of_items
schreiben Sie Folgendes, um es in einem Inline-Skript anstelle eines HTML-Attributs zu verwenden:
<script>
const jsArrayOfItems = {{list_of_items | tojson}};
</script>
Verwenden Sie diese Option NICHT json.dumps
, um Variablen in Ihrem Python-Code mit JSON zu codieren und den resultierenden JSON-Text an Ihre Vorlage zu übergeben. Dies führt bei einigen Zeichenfolgenwerten zu einer falschen Ausgabe und setzt Sie XSS aus, wenn Sie versuchen, vom Benutzer bereitgestellte Werte zu codieren. Dies liegt daran, dass in Pythons integriertem json.dumps
Zeichen keine Zeichen wie <
und >
(die maskiert werden müssen, um Werte sicher in Inlines zu speichern) <script>
entfallen, wie unter https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for angegeben -Inhalte-von-Skript-Elementen ) oder einfache Anführungszeichen (die müssen, um Werte sicher in einfache HTML-Attribute mit einfachen Anführungszeichen zu verschieben).
Wenn Sie Flask verwenden, beachten Sie, dass Flask tojson
anstelle der Jinja-Version einen benutzerdefinierten Filter injiziert . Es gilt jedoch weiterhin alles oben Geschriebene. Die beiden Versionen verhalten sich fast identisch; Flask erlaubt nur einige app-spezifische Konfigurationen , die in Jinjas Version nicht verfügbar sind.
{{item|tojson|safe}}
stattdessen zu tun