经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
django框架防止XSS注入的方法分析
来源:jb51  时间:2019/6/21 11:18:42  对本文有异议

本文实例讲述了django框架防止XSS注入的方法。分享给大家供大家参考,具体如下:

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

这是我的评论,

  1. <script>alert('xss injection');</script>

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

  1. def checkxss(content):
  2. checked_content = content
  3. checked_content = re.sub(r"&", "&", checked_content,0,re.I)
  4. checked_content = re.sub(r"'", "´", checked_content,0,re.I)
  5. checked_content = re.sub(r'""', """, checked_content,0,re.I)
  6. checked_content = re.sub(r"<", "<", checked_content,0,re.I)
  7. checked_content = re.sub(r">", ">", checked_content,0,re.I)
  8. checked_content = re.sub(r"/", "/", checked_content,0,re.I)
  9.  

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

  1. '''
  2. Created on 2013-11-21
  3. @author: yihaomen.com
  4. '''
  5. from django.utils.html import escape, strip_tags, remove_tags
  6. html_content = """
  7. <html xmlns="http://www.w3.org/1999/xhtml">
  8. <head>
  9. <script>alert("test")</script>
  10. <title>yihaomen.com test</title>
  11. <link href="/static/css/style.css" rel="external nofollow" rel="stylesheet" type="text/css" />
  12. </head>
  13. <body>
  14. content
  15. </body>
  16. </html>
  17. """
  18. def escape_html(html):
  19. return escape(html);
  20. def stript_all_tags(html):
  21. return strip_tags(html)
  22. def remove_part_tags(html,tags):
  23. return remove_tags(html, tags)
  24. if __name__ == '__main__':
  25. print "====escape all tags======"
  26. print escape_html(html_content)
  27. print "====remove all tags======"
  28. print strip_tags(html_content)
  29. print "===remove part tags.====="
  30. print remove_part_tags(html_content,"script html body")
  31.  

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

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

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号