之前给自己的评论模块添加了支持markdown语法功能,在模板中直接使用了自定义的markdown标签(django1.6以后就移除了内置的markdown标签)和safe标签:
{{content|markdown_change|safe}}
# -*- coding: utf-8 -*-
from django import template
import markdown
register = template.Library()
@register.filter
def markdown_change(content):
content = markdown.markdown(content,extensions=['markdown.extensions.extra','markdown.extensions.codehilite','markdown.extensions.toc',],safe_mode=True)
return content
运行良好
可是当我在评论中填写<script type="text/javascript">alert("XSS");</script>
并提交时,就形成了XSS攻击。
在查阅了网上资料后,发现了一个库 django-markdown-deux,其使用方法比较简单,安装加入应用后,只需在页面导入 {% load markdown_deux_tags %}
,就可使用过滤器{{content|markdown}}
。其默认样式自动转义了html标签,防止了xss攻击。
你还可以在settings.py中自定义样式,覆盖其原有的默认样式
from markdown_deux.conf.settings import MARKDOWN_DEUX_DEFAULT_STYLE
MARKDOWN_DEUX_STYLES = {
"default": MARKDOWN_DEUX_DEFAULT_STYLE,
# Here is what http://code.activestate.com/recipes/ currently uses.
"recipe": {
"safe_mode": "escape",
"link_patterns": [
# Transform "Recipe 123" in a link.
(re.compile(r"recipe\s+#?(\d+)\b", re.I),
r"http://code.activestate.com/recipes/\1/"),
],
"extras": {
"code-friendly": None,
"pyshell": None,
"demote-headers": 3,
# `class` attribute put on `pre` tags to enable using
# <http: code.google.com="" p="" google-code-prettify=""/> for syntax
# highlighting.
"html-classes": {"pre": "prettyprint"},
"cuddled-lists": None,
"footnotes": None,
"header-ids": None,
},
}
}
但由于我要求不高,所以我不想使用这个库,django内置了转义函数,我们只需在自定义的过滤器中添加即可达到较好的效果
# -*- coding: utf-8 -*-
from django import template
import markdown
from django.utils.html import strip_tags #去掉所有html标签
register = template.Library()
@register.filter
def markdown_change(content):
content = strip_tags(content) #在转换为markdown之前去掉所有html标签,防止xss攻击
content = markdown.markdown(content,extensions=['markdown.extensions.extra','markdown.extensions.codehilite','markdown.extensions.toc',],safe_mode=True)
return content