django-markdown 防止XSS攻击

之前给自己的评论模块添加了支持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

如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值