2012-11-22 9 views
5

Ich akzeptiere Markdown und muss es in HTML konvertieren, um sicher in Django zu rendern. Im Moment bin ich die Annahme des form.cleaned_data und dessen Umwandlung in HTML mit:Django/Python: Markdown in sicheres HTML konvertieren

import markdown 
html_body = markdown.markdown(body_markdown, safe_mode=True) 
html_body = html_body.replace('[HTML_REMOVED]', '') 
return html_body 

In der Vorlage, ich bin Rendering es als:

{{ object.content|safe|capfirst }} 

Allerdings, wenn Sie Post:

0;url=javascript:alert('hi');" http-equiv="refresh 

Die JS wird rendern, so dass XSS möglich ist.

Antwort

2

django in safe template tag gebaut ist, bedeutet, dass Sie diese Variable als ok zur Ausgabe sind Kennzeichnung, das heißt Sie wissen, dass es Inhalte sind sicher ist:

sicher: Markiert eine Zeichenfolge als nicht weiter HTML erfordern vor der Ausgabe zu entkommen.

Django durch default escapes your template variables:

standardmäßig in Django entweicht jede Vorlage automatisch den Ausgang jedes Variablentag. Insbesondere sind diese fünf Zeichen entkommen ...

aber es wird die Javascript nicht weg Streifen für Sie (es wird nur unbrauchbar zu machen), müssen Sie mit einem Template-Tag das manuell tun:

Strip javascript code before rendering in django templates

auf der anderen Seite, safe_mode auf markdown Streifen beliebige HTML in dem Text mit [HTML REMOVED] wie Sie gesehen haben.

So safe Entfernen sollte ausreichen, um es sicher zu machen,

+0

Danke für die Antwort. Ich habe "sicher" aus der Vorlage entfernt, es wird jedoch immer noch gerendert. In der JS schließe ich nicht nur Skript-Tags "0; url = javascript: alert ('hi');" http-equiv = "refresh", das den JS-Filter durchläuft. – user1846171

+0

wo wird gerendert? Wenn der HTML-Code entfernt wird und keine '