04: 使用BeautifulSoup封装的xss过滤模块
目录:
1.1 xss攻击简介返回顶部
1、简介
1. 跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS。
2. XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去
3. 使别的用户访问都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
2、XSS攻击的危害包括:
1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击
3、原因解析
主要原因:过于信任客户端提交的数据!
解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。
1.2 xss攻击解决方法返回顶部
1、修复漏洞方针
【不相应用户提交的数据,过滤过滤过滤!】
1、将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
2、表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。
3、对数据进行Html Encode 处理
4、过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for
5、过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。
2、使用BeautifulSoup模块解决xss攻击
1.安装BeautifulSoup
1、BeautifulSoup是bs4的一个模块,直接安装bs4即可
2、安装命令: pip install bs4
2.BeautifulSoup基础使用
content="""
<p class='c1' id='i1'>
asdfaa<span style="font-family:NSimSun;" class='c1'>sdf<a>a</a>sdf</span>sdf
</p>
<p>
<strong class='c2' id='i2'>asdf</strong>
<script>alert(123)</script>
</p>
<h2>
asdf
</h2>
""" from bs4 import BeautifulSoup
# 1.转换成结构化字符串
# html.parser是Python内置的一个解析器,当传入后会解析成一个结构的文档
soup = BeautifulSoup(content, 'html.parser') # 2. 对整个标签进行修改操作
tag = soup.find('script') #找到script标签
tag.clear() #只将script标签中的内容清空
tag.hidden = True #将script中标签和内容全部隐藏
content_to_str = soup.decode() #将内容再转换成字符串 # 3. 对标签的某些属性进行操作
span = soup.find('span') #找到最前的一个span标签
print('span',span) # {'style': 'font-family:NSimSun;', 'class': ['c1']} print(span.attrs) #找到span标签中的所有的属性:返回结果是字典
del span.attrs['style'] #删除span标签的某个属性
BeautifulSoup基础使用
3. 使用for循环对内容进行白名单过滤
content="""
<p class='c1' id='i1'>
asdfaa<span style="font-family:NSimSun;" class='c1'>sdf<a>a</a>sdf</span>sdf
</p>
<p>
<strong class='c2' id='i2'>asdf</strong>
<script>alert(123)</script>
</p>
<h2>
asdf
</h2>
""" from bs4 import BeautifulSoup
# html.parser是Python内置的一个解析器,当传入后会解析成一个结构的文档
soup = BeautifulSoup(content, 'html.parser') tags = {
'p': ['class'], #设置p标签仅允许class属性
'strong': ['id',] #设置strong标签仅允许id属性
} for tag in soup.find_all(): # find_all()方法可以找到所有标签(子子孙孙查找)
#1. 只允许有p标签和strong标签
if tag.name in tags:
pass
else:
tag.hidden = True
tag.clear()
continue #如果标签名不符合就不执行下面的for循环了
#2. p标签只允许class属性,strong标签只允许id属性
# 用户提交的所有属性
input_attrs = tag.attrs # {'class': 'c1', 'id': 'i1'}
# 允许对应标签的指定属性有哪些
valid_attrs = tags[tag.name] # ['class'] # 字典在for循环迭代时是不可以删除某个项的,这里利用list转换
for k in list(input_attrs.keys()):
if k in valid_attrs:
pass
else:
del tag.attrs[k]
content_to_str = soup.decode()
print('fdasffsdsdf',content_to_str)
使用for循环对内容进行白名单过滤
3、BeautifulSoup模块安装与基本使用
from bs4 import BeautifulSoup
class XSSFilter(object):
__instance = None
def __init__(self): # XSS白名单
self.valid_tags = {
"font": ['color', 'size', 'face', 'style'],
'b': [],
'div': [],
"span": [],
"table": [
'border', 'cellspacing', 'cellpadding'
],
'th': [
'colspan', 'rowspan'
],
'td': [
'colspan', 'rowspan'
],
"a": ['href', 'target', 'name'],
"img": ['src', 'alt', 'title'],
'p': ['align'],
"pre": ['class'],
"hr": ['class'],
'strong': []
}
def __new__(cls, *args, **kwargs):
if not cls.__instance:
obj = object.__new__(cls, *args, **kwargs)
cls.__instance = obj
return cls.__instance
def process(self, content):
soup = BeautifulSoup(content, 'html.parser') # 遍历所有HTML标签
for tag in soup.find_all(recursive=True): # 判断标签名是否在白名单中
if tag.name not in self.valid_tags:
tag.hidden = True
if tag.name not in ['html', 'body']:
tag.hidden = True
tag.clear()
continue # 当前标签的所有属性白名单
attr_rules = self.valid_tags[tag.name]
keys = list(tag.attrs.keys())
for key in keys:
if key not in attr_rules:
del tag[key]
return soup.decode() #这里返回的就是过滤完的内容 content="""
<p class='c1' id='i1'>
asdfaa<span style="font-family:NSimSun;" class='c1'>sdf<a>a</a>sdf</span>sdf
</p>
<p>
<strong class='c2' id='i2'>asdf</strong>
<script>alert(123)</script>
</p>
<h2>
asdf
</h2>
""" content = XSSFilter().process(content)
print('content',content)
使用BeautifulSoup封装的xss过滤模块
04: 使用BeautifulSoup封装的xss过滤模块的更多相关文章
- HTML标签防XSS攻击过滤模块--待优化
HTML标签防XSS攻击过滤模块 http://cnodejs.org/topic/5058962f8ea56b5e7806b2a3
- dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)
dedecms虽然有诸多漏洞,但不可否认确实是一个很不错的内容管理系统(cms),其他也不乏很多功能实用性的函数,以下就部分列举,持续更新,不作过多说明.使用时需部分修改,你懂的 1.XSS过滤. f ...
- XSS过滤
XSS过滤封装用法 封装到app01/form.py文件中进行验证 from django.forms import Form,widgets,fields class ArticleForm(For ...
- Python开发【Django】:组合搜索、JSONP、XSS过滤
组合搜索 做博客后台时,需要根据文章的类型做不同的检索 1.简单实现 关联文件: from django.conf.urls import url from . import views urlpat ...
- python(Django之组合搜索、JSONP、XSS过滤 )
一.组合搜索 二.jsonp 三.xss过滤 一.组合搜索 首先,我们在做一个门户网站的时候,前端肯定是要进行搜索的,但是如果搜索的类型比较多的话,怎么做才能一目了然的,这样就引出了组合搜索的这个案例 ...
- xss 过滤
一. xss过滤 用户通过Form获取展示在终端, 提交数据,Form验证里面加入xss验证(对用户提交的内容验证是否有关键标签) from django.conf.urls import url f ...
- KindEditor 和 xss过滤
KindEditor 1.进入官网 2.下载 官网下载:http://kindeditor.net/down.php 本地下载:http://files.cnblogs.com/files/wup ...
- Asp.net Mvc中利用ValidationAttribute实现xss过滤
在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...
- 《深入理解Nginx》阅读与实践(四):简单的HTTP过滤模块
一.Nginx的HTTP过滤模块特征 一个请求可以被任意个HTTP模块处理: 在普通HTTP模块处理请求完毕并调用ngx_http_send_header()发送HTTP头部或调用ngx_http_o ...
随机推荐
- js之操作cookie
js通过document.cookie获取所有的cookie信息, cookie在存储的格式是键值对,key=value每个键值对之间用; (分号和空格隔开). 添加cookie和修改cookie的值 ...
- 代码实现SQL SERVER TCP/IP协议配置
代码实现SQL SERVER TCP/IP协议配置 SET NOCOUNT ON ) ,) ,) SET @Root = 'HKEY_LOCAL_MACHINE' SET @Path = 'Softw ...
- HDU 1068 Girls And Boys 二分图题解
版权声明:本文作者靖心.靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
- 查看修改MySQL字符集
查看修改MySQL字符集 http://blog.sina.com.cn/s/blog_70ac6bec01016fts.html 查看修改MySQL字符集 (2012-08-22 09:53:21) ...
- [py][mx]django注册-邮件激活
人生,学习,就是一段旅途, 说是放弃,其实是自信心作祟. 因为不同时间段状态,譬如晚上和早上刚来状态不一样.做相同事情容器失去自信而放弃. 坚持可以打破这个魔咒 还有就是有些问题得分割, 不要让压死牛 ...
- python3内置函数大全(顺序排列)
python3内置函数大全 内置函数 (1)abs(), 绝对值或复数的模 1 print(abs(-6))#>>>>6 (2)all() 接受一个迭代器,如果迭代器的所有 ...
- Ultra-QuickSort(poj 2299归并排序)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=232#problem/A B - Ultra-QuickSort Time Li ...
- Bus System(Flody)
http://acm.hdu.edu.cn/showproblem.php?pid=1690 坑爹的题,必须用__int64 %I64d(以前没用过) 因为这题的数据特别大,所以用-1 #includ ...
- Android APP安装后不在桌面显示图标的应用场景举例和实现方法
最近在为公司做一款车联网的产品,由于公司本身擅长于汽车解码器的研发,所以该产品的诊断功能的实现除了使用目前市面上车联网产品中大量使用的OBD协议外,还会使用一些专车专用协议去实现一些特殊的诊断功能,如 ...
- pycharm跳到指定的行
ctrl+g 弹出一个框,输入要跳的行数 ctrl+home 光标移到第一行 ctrl+end 光标移到最后一行