一、前言

  我们在提交文本到后台的时候,比如我们在写博客的过程中,如果有人在博客中写入 <script>alert(123)</script>  等,如果你在后台不把它过滤掉,那就会受到攻击,你的网站压根就没有办法用,那有什么办法过滤呐,今天我们就用一个 BeautifulSoup 这个模块来过滤一些,那如果使用这个模块呐,在使用之前必须安装这个模块:

pip install beautifulsoup4

ok,我们下面就来看看,如果使用这个模块,来过滤 XSS。

二、XSS过滤

2.1、操作的html

说明:以下的代码,都是针对我们所操作的html

content = '''<p>dwqdq<span style="font-family:NSimSun">sqsqsqsq</span></p><p><strong id='d10'>dwqdqw</strong><script>alert(123)</script></p><h2>qwdqwd</h2>
'''

2.2、知识点

说明:在过滤之前,我们要掌握一些知识点

from bs4 import BeautifulSoup
#清空某个标签,比如攻击的script标签
soup = BeautifulSoup(content,'html.parser')
tag = soup.find('script')  #找到script 标签
tag.hidden = True  #表示让script这个标签隐藏
tag.clear() #把找到那个标签清空
print(tag)#删除某个标签的属性
span = soup.find('span')
print(span.attrs)
del span.attrs['style']  #删除span标签style属性
print(span)#把对象转换成字符串的形式
content = soup.decode()
print(content)

2.2、只过滤标签

说明:如果我只过滤掉标签的话,不过滤标签属性

from bs4 import BeautifulSoup
#添加过了白名单
tags = ['p','strong']  #只允许添加p标签和strong标签
soup = BeautifulSoup(content,'html.parser')for tag in soup.find_all(): #find_all()找到所有标签if tag.name in tags:passelse:tag.hidden = Truetag.clear()content = soup.decode()
print(content)

2.3、过滤标签和标签属性

说明:我不仅要过滤标签,还要过滤掉标签属性

from bs4 import BeautifulSoup
#白名单
tags = {'p':['class'],'strong':['id'],
}
soup = BeautifulSoup(content,'html.parser')
for tag in soup.find_all():if tag.name in tags:passelse:tag.hidden = Truetag.clear()continue  #如果不在白名单,直接跳过# 用户提交标签的所有属性input_attrs = tag.attrs  # ['class':'c1','id':'i']valid_attrs = tags[tag.name]  #['class']for k,v in list(input_attrs.items()):  #input_attrs.items()会自动生成一个迭代器,del tag.attrs[k]是无法删除的if k in valid_attrs:passelse:del tag.attrs[k]

注意了:一般我们需要对后台提交过来的数据是要过滤的,特别是 kindEditor编辑器

三、单实例

  我们都知道,我们在创建对象的时候,创建多个对象占的内存资源一定比创建一个对象占的资源多很多,所以我们,应该采用单实例模式,就是永远用一个对象示例

 3.1、定义静态方法方式实现

说明:我们定义一个静态方法get_instance,去实现一个单实例的方式

class Foo(object):instance = None  #初始化一个对象def __init__(self):self.name = 'alex'@classmethoddef get_instance(cls):if Foo.instance:  #如果对象已经存在,就直接返回这个对象return Foo.instanceelse:  #不存在就创建一个新的对象Foo.instance = Foo()return Foo.instancedef process(self):return '123'obj1 = Foo.get_instance()
print(id(obj1))
obj2 = Foo.get_instance()
print(id(obj2))#输出
2483145426760
2483145426760

以上这种还是比较low的,我们还需要通过定义静态方法来搞定。

3.2、重写new方法实现

说明:我们知道一个创建一个对象,先执行 它的 __new__方法  ,再去执行 __init__方法,所以我们重写new方法即可

class Foo(object):instance = None  #初始化一个对象def __init__(self):self.name = 'alex'def __new__(cls, *args, **kwargs):if Foo.instance:  #如果对象已经存在,就直接返回这个对象return Foo.instanceelse:  #不存在就创建一个新的对象Foo.instance = object.__new__(cls, *args, **kwargs)return Foo.instancedef process(self):return '123'obj1 = Foo()
print(obj1)
obj2 = Foo()
print(obj2)#输出
<__main__.Foo object at 0x00000156A41D4748>
<__main__.Foo object at 0x00000156A41D4748>

3.3、抄袭武sir的写法

class Foo(object):__instance = None  #初始化一个对象def __init__(self):self.name = 'alex'def __new__(cls, *args, **kwargs):if not cls.__instance:obj = object.__new__(cls, *args, **kwargs)cls.__instance = objreturn cls.__instancedef process(self):return '123'obj1 = Foo()
print(obj1)
obj2 = Foo()
print(obj2)#输出
<__main__.Foo object at 0x00000230DA454748>
<__main__.Foo object at 0x00000230DA454748>

四、总结

KindEditor编辑器:

  1、beautifulsoup4 对标签进行过滤

  2、单实例模式 => 永远用一个对象的实例

转载于:https://www.cnblogs.com/zhangqigao/articles/9075623.html

day24-XSS过滤及单实例相关推荐

  1. Java简单的XSS过滤方法

    Java简单的XSS过滤方法 因为某甲方程序XSS过滤类一直没起作用,所以百度了下,简单的写了个参数XSS过滤方法.....上代码~~ import java.io.UnsupportedEncodi ...

  2. Python开发【Django】:组合搜索、JSONP、XSS过滤

    组合搜索 做博客后台时,需要根据文章的类型做不同的检索 1.简单实现 关联文件: from django.conf.urls import url from . import viewsurlpatt ...

  3. AIR32F103(九) CAN总线的通信和ID过滤机制及实例

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  4. spring boot实战之XSS过滤

    XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意 ...

  5. XSS过滤绕过速查表

    写在前面: 第一次翻译长篇文档,如有疏漏还请各位大牛指正.OWASP的这篇速查表虽然时间比较久了,但还在更新,所以还是翻译出来了.翻译完发现里面还是有一些值得借鉴的思路,用来涨知识还是可以的.由于篇幅 ...

  6. 金蝶云星空与钉钉对接集成供应商查询打通新增表单实例

    金蝶云星空与钉钉对接集成供应商查询打通新增表单实例 对接系统金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台.金蝶K/3C ...

  7. mysql 单实例部署_Mysql 数据库单机多实例部署手记

    最近的研发机器需要部署多个环境,包括数据库.为了管理方便考虑将mysql数据库进行隔离,即采用单机多实例部署的方式. 找了会资料发现用的人也不是太多,一般的生产环境为了充分发挥机器性能都是单机单实例运 ...

  8. 表单实例(判断两次密码是否一致)

    表单实例(判断两次密码是否一致) 一.实例描述: 本例是一个综合性的练习,除了们正在学习的JS知识外,还用到了HTML的表格,表单等相关知识. 二.截图 三.代码 1 <!DOCTYPE htm ...

  9. python编写单实例总结

    python编写单实例总结 1 单实例的属性都可以在__init__方法中按照sell.x=x添加 2  实例内部某方法调用实例另一方法用self方式 def fun1(self,x):     re ...

  10. 单实例的写法最保险的写法应采用静态方式的预生成 ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也要谨慎,需要考证是否解决这个问题

    单实例的写法最保险的写法应采用静态方式的预生成  ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也需要考证是否解决了这个问题 推荐写法案例一 /*以单例模式启动*/     pri ...

最新文章

  1. PHP面向对象(OOP)编程入门教程
  2. sql backup database备份d盘_ClickHouse 备份与恢复
  3. java enum类探索
  4. 78oa mysql_78OA系统安装后无法打开解决方案
  5. LINUX C系统编程与PYTHON中的时间模块对比
  6. SQLite 的日期时间函数
  7. 人是中国开源产业发展的战略制高点
  8. Java中动态代理使用与原理详解
  9. kali虚拟机系统无法联网;apt-get时无法解析域名
  10. Java入门(四)JAVA SE 02
  11. JavaScript-事件和事件对象、实现键盘打字小游戏
  12. VBA自定义菜单和菜单栏
  13. Apache NiFi系统管理员指南 [ 二 ]
  14. lua java 加密解密_AES加解密多版本(GO、JAVA、Python)实现
  15. 一键清理windows系统无用缓存数据
  16. windows不是正版_国人为什么不买正版,而喜欢“破解”软件?终于找到原因了...
  17. 产品需求文档(PRD)基本框架
  18. 完满(Full)二叉树,完全(Complete)二叉树, 完美(Perfect)二叉树
  19. VUE 学习笔记(三) Vue 渲染流程详解
  20. 内置MOS DC-DC 升压IC

热门文章

  1. Atitit rest框架选型总结 Resteasy 实现 但是麻烦 作为JAX-RS的标准实现,RestEasy还具有以下亮点特性:   1)不需要配置文件,只要把JARs文件放到类路径里面
  2. Atitit spring 定时器 CRON表达式    含义  目录 1.1. 大概流程 1 1.2. 核心源码springboot 1 1.3. Cron表达式属性——String 2 1.4
  3. Atitit 个人 企业 政府 等组织 财政收入分类与提升途径attilax总结 v2
  4. Atitit 自然语言处理原理与实现 attilax总结
  5. Atitit.jsou html转换纯文本 java c# php
  6. atitit.信息安全的控制总结o7
  7. paip.导入数据英文音标到数据库mysql为空的问题之道解决原理
  8. paip.slap工具与于64位win7与JDBC的性能对比
  9. paip.换工作机后svn服务修复
  10. paip.为什么软件体积越来越大