cgi.escape scheint eine mögliche Wahl zu sein. Funktioniert es gut Gibt es etwas, das als besser angesehen wird?
cgi.escape
ist gut. Es entkommt:
<
zu <
>
zu >
&
zu &
Das reicht für alles HTML.
BEARBEITEN: Wenn Sie Nicht-ASCII-Zeichen haben, möchten Sie auch entkommen, um sie in ein anderes codiertes Dokument aufzunehmen, das eine andere Codierung verwendet, wie Craig sagt. Verwenden Sie einfach:
data.encode('ascii', 'xmlcharrefreplace')
Vergessen Sie nicht , zu dekodieren , data
um unicode
erste, mit was auch immer dafür kodierenden codiert wurde.
Nach meiner Erfahrung ist diese Art der Codierung jedoch nutzlos, wenn Sie unicode
von Anfang an immer mit ihnen arbeiten. Codieren Sie einfach am Ende mit der im Dokumentkopf angegebenen Codierung ( utf-8
für maximale Kompatibilität).
Beispiel:
>>> cgi.escape(u'<a>bá</a>').encode('ascii', 'xmlcharrefreplace')
'<a>bá</a>
Bemerkenswert (danke Greg) ist auch der zusätzliche quote
Parameter cgi.escape
. Wenn es auf gesetzt ist, True
wird cgi.escape
auch chars ( "
) in doppelten Anführungszeichen maskiert, sodass Sie den resultierenden Wert in einem XML / HTML-Attribut verwenden können.
BEARBEITEN: Beachten Sie, dass cgi.escape in Python 3.2 zugunsten von veraltet ist html.escape
, was dasselbe tut, außer dass quote
standardmäßig True verwendet wird.
cgi.escape
Funktion ausführe , reicht dies aus, um mich vor allen (bekannten) XSS-Attacs zu schützen?cgi.escape(yourunicodeobj).encode('ascii', 'xmlcharrefreplace') == '{{Measures 12 Ω"H x 17 5/8"W x 8 7/8"D. Imported.}}'
- Wie Sie sehen können, gibt der Ausdruck ASCII-Bytestring zurück, wobei alle Nicht-ASCII-Unicode-Zeichen mithilfe der XML-Zeichenreferenztabelle codiert werden.In Python 3.2 wurde ein neues
html
Modul eingeführt, mit dem reservierte Zeichen aus dem HTML-Markup entfernt werden.Es hat eine Funktion
escape()
:quelle
quote=True
?html.escape()
Anführungszeichen standardmäßig nicht verwendet werden (im Gegensatz dazucgi.quote()
nicht - und nur doppelte Anführungszeichen, wenn dies mitgeteilt wird). Daher muss ich explizit einen optionalen Parameter festlegen, um etwas in ein Attributhtml.escape()
t = '" onclick="alert()'; t = html.escape(t, quote=False); s = f'<a href="about.html" class="{t}">foo</a>'
escape()
es nicht ausreicht, um Attribute sicher zu machen. Mit anderen Worten, dies ist nicht sicher:<a href=" {{ html.escape(untrusted_text) }} ">
href
ist das Festlegen einer Inhaltssicherheitsrichtlinie, die dies nicht zulässt.html.escape
einfache Anführungszeichen und doppelte Anführungszeichen entgehen.Wenn Sie HTML in einer URL maskieren möchten:
Dies ist wahrscheinlich NICHT das, was das OP wollte (die Frage gibt nicht eindeutig an, in welchem Kontext das Escapezeichen verwendet werden soll), aber Pythons native Bibliothek urllib verfügt über eine Methode, um HTML-Entitäten zu maskieren, die sicher in eine URL aufgenommen werden müssen.
Das Folgende ist ein Beispiel:
Hier finden Sie Dokumente
quelle
Es gibt auch das ausgezeichnete markupsafe Paket .
Das
markupsafe
Paket ist ausgereift und wahrscheinlich der vielseitigste und pythonischste Weg, um zu entkommen, IMHO, weil:Markup
) ist eine von Unicode abgeleitete Klasse (dhisinstance(escape('str'), unicode) == True
__html__
Eigenschaft) und Vorlagenüberladungen (__html_format__
).quelle
cgi.escape
sollte gut sein, um HTML im begrenzten Sinne der HTML-Tags und Zeichenentitäten zu entkommen.Möglicherweise müssen Sie jedoch auch Codierungsprobleme berücksichtigen: Wenn der HTML-Code, den Sie zitieren möchten, Nicht-ASCII-Zeichen in einer bestimmten Codierung enthält, müssen Sie auch darauf achten, dass Sie diese beim Zitieren sinnvoll darstellen. Vielleicht könnten Sie sie in Entitäten konvertieren. Andernfalls sollten Sie sicherstellen, dass die korrekten Codierungsübersetzungen zwischen dem HTML-Quellcode und der eingebetteten Seite durchgeführt werden, um eine Beschädigung der Nicht-ASCII-Zeichen zu vermeiden.
quelle
Keine Bibliotheken, reines Python, entkommen sicher Text in HTML-Text:
quelle
<
wird entkommen&lt;
cgi.escape
verlängertDiese Version verbessert sich
cgi.escape
. Außerdem bleiben Leerzeichen und Zeilenumbrüche erhalten. Gibt eineunicode
Zeichenfolge zurück.beispielsweise
quelle
Nicht der einfachste Weg, aber dennoch unkompliziert. Der Hauptunterschied zum cgi.escape- Modul - es funktioniert immer noch einwandfrei, wenn Sie es bereits
&
in Ihrem Text haben. Wie Sie aus den Kommentaren sehen:cgi.escape Version
Regex-Version
quelle
Für Legacy-Code in Python 2.7 ist dies über BeautifulSoup4 möglich :
quelle