django 富文本RSS防御

2016/5/31 posted in  python

富文本攻击

在富文本编辑器中,可以写入一些相关的html等,在我们读出到页面的时候,由于为了省去html标签,所以一般会使用safe过滤器进行过滤。攻击者可以在富文本编辑器中输入 等方式来进行富文本的攻击。

基本方法

一般可以采用removetags的方式来进行去掉某些关键标签,这在简单的情况下是适用的,如下:

    {% if rtf_con %}
        {{ rtf_con | removetags:"script " | safe }}
    {% endif %}

但是这种方式只能过滤掉某些标签,过滤情况不完全,如大小写之类的便无法过滤。而html又是不标准的,所以很多情况下是过滤不完全的。

使用python-xss-filter防护

富文本XSS基本上使用白名单进行过滤,通过白名单的仅留下需要使用、并且基本不产生危害的标签和属性。

https://github.com/phith0n/python-xss-filter

直接使用python-xss-filter进行富文本的过滤。

基本文本的XSS防御

Django默认开启了输入转义来防范XSS,可以使用两种方法来关闭自动转义

方法一:使用过滤器“|safe”关闭单个变量的自动转义

    <h1>Submit-Content</h1>
    {{ xss_content | safe}}

方法二:使用{%autoescape off%}的方式关闭代码段的自动转义

    {% autoescape off %}
        <h1>Submit-Content</h1>
        {{ xss_content }}
    {% endautoescape %}

在autoescape off中可以局部开启autoescape,使用{% autoescape on%}即可

建议在非必要的情况下,不要关闭Django的自动转义功能。

代码检查:视图模版中是否使用了{{date|safe}}、{%autoescape off%}…{%endautoescape%}