day24-XSS过滤及单实例
一、前言
我们在提交文本到后台的时候,比如我们在写博客的过程中,如果有人在博客中写入 <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过滤及单实例相关推荐
- Java简单的XSS过滤方法
Java简单的XSS过滤方法 因为某甲方程序XSS过滤类一直没起作用,所以百度了下,简单的写了个参数XSS过滤方法.....上代码~~ import java.io.UnsupportedEncodi ...
- Python开发【Django】:组合搜索、JSONP、XSS过滤
组合搜索 做博客后台时,需要根据文章的类型做不同的检索 1.简单实现 关联文件: from django.conf.urls import url from . import viewsurlpatt ...
- AIR32F103(九) CAN总线的通信和ID过滤机制及实例
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- spring boot实战之XSS过滤
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意 ...
- XSS过滤绕过速查表
写在前面: 第一次翻译长篇文档,如有疏漏还请各位大牛指正.OWASP的这篇速查表虽然时间比较久了,但还在更新,所以还是翻译出来了.翻译完发现里面还是有一些值得借鉴的思路,用来涨知识还是可以的.由于篇幅 ...
- 金蝶云星空与钉钉对接集成供应商查询打通新增表单实例
金蝶云星空与钉钉对接集成供应商查询打通新增表单实例 对接系统金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台.金蝶K/3C ...
- mysql 单实例部署_Mysql 数据库单机多实例部署手记
最近的研发机器需要部署多个环境,包括数据库.为了管理方便考虑将mysql数据库进行隔离,即采用单机多实例部署的方式. 找了会资料发现用的人也不是太多,一般的生产环境为了充分发挥机器性能都是单机单实例运 ...
- 表单实例(判断两次密码是否一致)
表单实例(判断两次密码是否一致) 一.实例描述: 本例是一个综合性的练习,除了们正在学习的JS知识外,还用到了HTML的表格,表单等相关知识. 二.截图 三.代码 1 <!DOCTYPE htm ...
- python编写单实例总结
python编写单实例总结 1 单实例的属性都可以在__init__方法中按照sell.x=x添加 2 实例内部某方法调用实例另一方法用self方式 def fun1(self,x): re ...
- 单实例的写法最保险的写法应采用静态方式的预生成 ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也要谨慎,需要考证是否解决这个问题
单实例的写法最保险的写法应采用静态方式的预生成 ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也需要考证是否解决了这个问题 推荐写法案例一 /*以单例模式启动*/ pri ...
最新文章
- PHP面向对象(OOP)编程入门教程
- sql backup database备份d盘_ClickHouse 备份与恢复
- java enum类探索
- 78oa mysql_78OA系统安装后无法打开解决方案
- LINUX C系统编程与PYTHON中的时间模块对比
- SQLite 的日期时间函数
- 人是中国开源产业发展的战略制高点
- Java中动态代理使用与原理详解
- kali虚拟机系统无法联网;apt-get时无法解析域名
- Java入门(四)JAVA SE 02
- JavaScript-事件和事件对象、实现键盘打字小游戏
- VBA自定义菜单和菜单栏
- Apache NiFi系统管理员指南 [ 二 ]
- lua java 加密解密_AES加解密多版本(GO、JAVA、Python)实现
- 一键清理windows系统无用缓存数据
- windows不是正版_国人为什么不买正版,而喜欢“破解”软件?终于找到原因了...
- 产品需求文档(PRD)基本框架
- 完满(Full)二叉树,完全(Complete)二叉树, 完美(Perfect)二叉树
- VUE 学习笔记(三) Vue 渲染流程详解
- 内置MOS DC-DC 升压IC
热门文章
- Atitit rest框架选型总结 Resteasy 实现 但是麻烦 作为JAX-RS的标准实现,RestEasy还具有以下亮点特性: 1)不需要配置文件,只要把JARs文件放到类路径里面
- Atitit spring 定时器 CRON表达式 含义 目录 1.1. 大概流程	1 1.2. 核心源码springboot	1 1.3. Cron表达式属性——String	2 1.4
- Atitit 个人 企业 政府 等组织 财政收入分类与提升途径attilax总结 v2
- Atitit 自然语言处理原理与实现 attilax总结
- Atitit.jsou html转换纯文本 java c# php
- atitit.信息安全的控制总结o7
- paip.导入数据英文音标到数据库mysql为空的问题之道解决原理
- paip.slap工具与于64位win7与JDBC的性能对比
- paip.换工作机后svn服务修复
- paip.为什么软件体积越来越大