django 防止 XSS 注入的方法

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

这是我的评论,<script>alert('xss injection');</script>

而我在模板中是这样使用的 {{comment|safe}}, 由于使用了 safe filter ,所以这里会直接弹出对话框出来。这就是XSS 注入了。真实的项目中是不允许出现这样的情况的,用safe 的目的是为了更好的显示html标签等。所以要解决的方式是在后台接收到内容的时候,进行转义处理,特别是 "< > " 这些符号,以及 单引号,双引号等,最初,我自己写了一些替换方法。比如
程序代码 程序代码

def checkxss(content):
    checked_content = content
    checked_content = re.sub(r"&", "&", checked_content,0,re.I)
    checked_content = re.sub(r"'", "´", checked_content,0,re.I)
    checked_content = re.sub(r'""', """, checked_content,0,re.I)
    checked_content = re.sub(r"<", "<", checked_content,0,re.I)
    checked_content = re.sub(r">", ">", checked_content,0,re.I)
    checked_content = re.sub(r"/", "/", 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 = """
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <script>alert("test")</script>
    <title>yihaomen.com test</title>
    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
     content
    </body>
    </html>
"""

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 注入.

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: django xss
相关日志:
评论: 1 | 引用: 0 | 查看次数: -
回复回复悔恨地阿毛[2014-06-10 05:37 PM | del]
博主的文章已经帮了我好多次了,留个感谢=w=
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.