django 防止 XSS 注入的方法

摘要: XSS 是常见的跨站脚本攻击,而且这种类型的错误很不容易被发现或者被开发人员忽视,当然django 框架本身是有这方面的考虑的,比如在模板中自动开启了 escape, 但事实上,我在改版我的 个人博客 yihaomen.duapp.com 时,在评论框的地方没有用到富文本编辑器,而是让用户自己输入内容,如果某个用户输入了如下类似的东西

XSS 是常见的跨站脚本攻击,而且这种类型的错误很不容易被发现或者被开发人员忽视,当然django 框架本身是有这方面的考虑的,比如在模板中自动开启了 escape, 但事实上,我在改版我的 个人博客 yihaomen.duapp.com 时,在评论框的地方没有用到富文本编辑器,而是让用户自己输入内容,如果某个用户输入了如下类似的东西:

这是我的评论,

而我在模板中是这样使用的 {{comment|safe}}, 由于使用了 safe filter ,所以这里会直接弹出对话框出来。这就是XSS 注入了。真实的项目中是不允许出现这样的情况的,用safe 的目的是为了更好的显示html标签等。所以要解决的方式是在后台接收到内容的时候,进行转义处理,特别是 "< > " 这些符号,以及 单引号,双引号等,最初,我自己写了一些替换方法。比如
def checkxss(content):
    checked_content = content
    checked_content = re.sub(r"&", "&amp;", checked_content,0,re.I)
    checked_content = re.sub(r"'", "&acute;", checked_content,0,re.I)
    checked_content = re.sub(r'""', "&quot;", checked_content,0,re.I)
    checked_content = re.sub(r"<", "&lt;", checked_content,0,re.I)
    checked_content = re.sub(r">", "&gt;", checked_content,0,re.I)
    checked_content = re.sub(r"/", "&#47;", checked_content,0,re.I)


当然在后台处理掉这些,然后保存到数据库,再次打开的时候,在模板用|safe 过滤器,就会还原成原来的样子,确实没错。但问题是我自己画蛇添足了。因为django 自身有一系列的方法。这些方法在 django.utils.html package中。我用这几个写一个测试.

'''
Created on 2013-11-21
@author: yihaomen.com
'''
from django.utils.html import escape, strip_tags, remove_tags

html_content = """
    
    
    
    yihaomen.com test
    
    
    
     content
    
    
"""

def escape_html(html):
    return escape(html);

def stript_all_tags(html):
    return strip_tags(html)

def remove_part_tags(html,tags):
    return remove_tags(html, tags)

if __name__ == '__main__':
    print "====escape all tags======"
    print escape_html(html_content)
    print "====remove all tags======"
    print strip_tags(html_content)
    print "===remove part tags.====="
    print remove_part_tags(html_content,"script html body")


当然还有更多的方法,可以查看django的代码。 以上的方法可以看到 django 可以很方便的 eacape 所有html标签,也可以部分 escape html标签,还可以只保留内容等。确实很方便。

由此可见用 django.utils.html 里面的东西,足够应付 xss 注入.

上一篇: mybatis补充教程之二:传递多个参数的方法(Multiple parameters)
下一篇: mybatis补充教程之三:缓存(cache)的使用

Avatar

悔恨地阿毛 评论于: 2014-06-10

博主的文章已经帮了我好多次了,留个感谢=w=
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号