XSS过滤
XSS过滤封装用法
封装到app01/form.py文件中进行验证
from django.forms import Form,widgets,fields class ArticleForm(Form):
title = fields.CharField(max_length=64)
content = fields.CharField(
widget=widgets.Textarea(attrs={'id':'i1'})) #此处为xss验证
def clean_content(self):
old = self.cleaned_data['content']
from utils.xss import xss
return xss(old)
app01/form.py
CONTENT=''
def create_article(request,site):
from app01.form import ArticleForm
if request.method == 'GET':
obj = ArticleForm()
return render(request,'creat_article.html',{'site':site})
else:
obj = ArticleForm(request.POST)
if obj.is_valid():
content = obj.cleaned_data['content']
global CONTENT #这里记得要设置全局变量
CONTENT = content
return HttpResponse('上传成功') # 查看文章内容,只是简单的
def see(request):
return render(request,'see.html',{'CONTENT':CONTENT})
app01/views
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>$Title$</title>
</head>
<body>
<h3>发布文章</h3>
<form action="/background/{{ site }}/create_article.html" method="POST">
{% csrf_token %}
文章标题<input type="text">
<textarea name="content" id="i1" cols="" rows=""></textarea>
<input type="submit" value="提交" style="margin-left: 35%">
</form> <script src="/static/kindeditor-4.1.10/kindeditor-all.js"></script>
<script>
// KindEditor 上传的瞬间,帮你生成iframe+form进行伪Ajax操作
KindEditor.create('#i1',{
width:'1000px',
height:'500px',
resizeType:2, // 默认是否可以拖动改变高度和宽带,0,1,2,其中默认是2,可以拖动改变宽度和高度。
uploadJson:'/upload_img.html', // 上传文件位置,注意不能写目录/static/files...类似这种,识别不了。要写url
// 注意:上传文件时,是以POST请求提交的,但是要写上{% csrf_token %},上面表单中写的上传文件时没法用到,要配置
extraFileUploadParams:{'csrfmiddlewaretoken':"{{ csrf_token }}"} })
</script>
</body>
</html>
creat_article.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>$Title$</title>
</head>
<body>
{{ CONTENT|safe }}
</body>
</html>
see.html
from bs4 import BeautifulSoup
def xss(old):
soup = BeautifulSoup(old,'html.parser')
tags = soup.find_all()
vaild_tag = {'p':['class','id'],'img':['src'],'div':['class']}
for tag in tags:
if tag.name not in vaild_tag:
tag.decompose()
if tag.attrs:
for k in list(tag.attrs.keys()):
if k not in vaild_tag[tag.name]:
del tag.attrs[k]
comment_str=soup.decode()
return comment_str
utils/xss.py
url(r'^background/(\w+)/create_article.html$', views.create_article),
url(r'^see.html', views.see),
urls
下面是xss.py内容的注释
# 通过beautifulsoup4 模块可以避免写正则表达式来完成过滤上传文件中的恶意攻击
from bs4 import BeautifulSoup
content = """
<p id='i1' a='123' b='999'>
<script>alert(123)</script>
</p> <p id='i2'>
<div>
<p>asdfasdf</p>
</div>
<img id='i3' src="/static/imgs\1.jpg" alt="" />
</p>
"""
soup = BeautifulSoup(content,'html.parser') # parser为beautifulsoup4 模块的内置解析块,将html解析成对象
tag = soup.find(name='img') # 获取的是img标签,name= 标签名
# print(tag) #<img alt="" id="i3" src="/static/imgs.jpg"/> ,为字符串??
tag = soup.find(name='p') #获取的是 p 标签及 p 标签内的子内容
# print(tag) #<p a="123" b="999" id="i1"><script>alert(123)</script></p>
v = soup.find(name='p',attrs={'id':'i2','name':''}) # 也可以通过id 和 name 获取,条件是且的关系
# print(v) #<p id='i2'><div><p>asdfasdf</p></div><img id='i3' src="/static/imgs\1.jpg" alt="" /></p>
# 以上find 获取的都是选中的内容和其内部包含的子内容,且获取的是字符串类型
#find_all 获取的是列表类型,列表里是对象
v = soup.find_all(name='p')
# print(v) #递归找到所有的标签,步骤:找第一个父类,父类和子类中符合的取出来,然后再把子类符合的标签取出来。子类符合的标签可能被取出来很多次
#[<p a="123" b="999" id="i1"><script>alert(123)</script></p>, <p id="i2"><div><p>asdfasdf</p></div><img alt="" id="i3" src="/static/imgs.jpg"/></p>, <p>asdfasdf</p>] #以下为过滤部分
vaild_tag = ['p','img','div'] #白名单,设置白名单不设黑名单的原因是xss攻击的方式多种多样,而且不断更新
tags = soup.find_all()
for tag in tags:
if tag.name not in vaild_tag:
# tag.clear() # tag.clear()只是把tag标签的内容删掉,标签本身不被删掉
tag.decompose() #删除的是标签内的内容和标签本身
print(soup) #soup是对象,要拿到过滤后的结果,需要decode下
comment_str=soup.decode() #comment_str 这是拿到最终被过滤后的结果 #白名单也可以设置为字典格式,标签部分属性设置为白名单
vaild_tag = {'p':['class','id'],'img':['src'],'div':['class']}
for tag in tags:
if tag.name not in vaild_tag:
tag.decompose()
if tag.attrs:
for k in list(tag.attrs.keys()):
if k not in vaild_tag[tag.name]:
del tag.attrs[k]
comment_str=soup.decode() #将soup对象转换成字符串,encode()将soup对象转换成字节
xss.py注释
XSS过滤的更多相关文章
- dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)
dedecms虽然有诸多漏洞,但不可否认确实是一个很不错的内容管理系统(cms),其他也不乏很多功能实用性的函数,以下就部分列举,持续更新,不作过多说明.使用时需部分修改,你懂的 1.XSS过滤. f ...
- Asp.net Mvc中利用ValidationAttribute实现xss过滤
在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...
- XSS过滤JAVA过滤器filter 防止常见SQL注入
Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...
- 如何在springboot项目中进行XSS过滤
简单介绍 XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意 ...
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- python(Django之组合搜索、JSONP、XSS过滤 )
一.组合搜索 二.jsonp 三.xss过滤 一.组合搜索 首先,我们在做一个门户网站的时候,前端肯定是要进行搜索的,但是如果搜索的类型比较多的话,怎么做才能一目了然的,这样就引出了组合搜索的这个案例 ...
- 04: 使用BeautifulSoup封装的xss过滤模块
目录: 1.1 xss攻击简介 1.2 xss攻击解决方法 1.1 xss攻击简介返回顶部 1.简介 1. 跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS. ...
- Python开发【Django】:组合搜索、JSONP、XSS过滤
组合搜索 做博客后台时,需要根据文章的类型做不同的检索 1.简单实现 关联文件: from django.conf.urls import url from . import views urlpat ...
- Bypass xss过滤的测试方法
0x00 背景 本文来自于<Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters>其中的byp ...
- xss 过滤
一. xss过滤 用户通过Form获取展示在终端, 提交数据,Form验证里面加入xss验证(对用户提交的内容验证是否有关键标签) from django.conf.urls import url f ...
随机推荐
- J2ee项目 编译依赖顺序
这儿有个帖子, 最后一个回复是: “我把我项目的libraries的"Order and Export"中的JRE与J2EE顺序换了一个问题解决”. 帖子地址: http://b ...
- javascript学习笔记-数据类型
一 数据类型 基本类型:undefined,null,boolean,number,string 保存在栈内存中 占用空间固定 变量直接从栈内存中存取的是该值 引用类型: ...
- 【Luogu】P2657windy数(数位DP)
题目链接 正式迈入了数位DP的大门…… 心情激动 (看我立个flag,我如果专攻数位DP的话,到wc之前就会有秒数位DP蓝题的能力) 数位DP讲解链接 讲的非常详细,良心博客.比我写的博客加在一起还要 ...
- CSS3box-shadow属性的使用
每次使用box-shadow,都要查阅资料才能实现对应的效果,现在总结一下,方便以后查看. 一.语法: E {box-shadow: inset x-offset y-offset blur-radi ...
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
- 最新版浏览器报错net::ERR_INSECURE_RESPONSE原因
访问的网址与接口请求的域名不一致,新版的chrome浏览器出于安全的考虑会将请求进行拦截,并报错net::ERR_INSECURE_RESPONSE
- The Luckiest number(hdu 2462)
给定一个数,判断是否存在一个全由8组成的数为这个数的倍数 若存在则输出这个数的长度,否则输出0 /* 个人感觉很神的一道题目. 如果有解的话,会有一个p满足:(10^x-1)/9*8=L*p => ...
- 2016 Multi-University Training Contest 10 solutions BY BUPT
1001. 一个数组上的两个区间求中位数,可以通过分类讨论直接找到中位数,复杂度O(1).不过本题数据较小,优美的log(n)也可过. 1002. 直接求得阴影面积表达式即可. 1003. 二分完成时 ...
- poj Pseudoprime numbers 3641
Pseudoprime numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10903 Accepted: 4 ...
- 两个时间相差多少 .net中的timespan应用
原文发布时间为:2008-10-31 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...