django框架防止XSS注入的方法分析


Posted in Python onJune 21, 2019

本文实例讲述了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="external nofollow" 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 注入.

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

Python 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
Python Image模块基本图像处理操作小结
Apr 13 Python
PyQt编程之如何在屏幕中央显示窗体的实例
Jun 18 Python
python检测服务器端口代码实例
Aug 31 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
python高级特性简介
Aug 13 Python
pyqt5中QThread在使用时出现重复emit的实例
Jun 21 #Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 #Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 #Python
django框架使用orm实现批量更新数据的方法
Jun 21 #Python
python字典改变value值方法总结
Jun 21 #Python
python如何以表格形式打印输出的方法示例
Jun 21 #Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 #Python
You might like
php入门小知识
2008/03/24 PHP
PHP学习之数组的定义和填充
2011/04/17 PHP
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php中JSON的使用方法
2015/04/30 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
BootStrap表单时间选择器详解
2017/05/09 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
深入理解python多进程编程
2016/06/12 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
简单谈谈python基本数据类型
2018/09/26 Python
Python的缺点和劣势分析
2019/11/19 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
模具专业毕业生自荐书范文
2014/02/19 职场文书
中学生演讲稿
2014/04/26 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
PHP实现考试倒计时功能代码
2021/04/16 PHP
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python