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过滤的更多相关文章

  1. dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)

    dedecms虽然有诸多漏洞,但不可否认确实是一个很不错的内容管理系统(cms),其他也不乏很多功能实用性的函数,以下就部分列举,持续更新,不作过多说明.使用时需部分修改,你懂的 1.XSS过滤. f ...

  2. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  3. XSS过滤JAVA过滤器filter 防止常见SQL注入

    Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...

  4. 如何在springboot项目中进行XSS过滤

    简单介绍 XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意 ...

  5. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  6. python(Django之组合搜索、JSONP、XSS过滤 )

    一.组合搜索 二.jsonp 三.xss过滤 一.组合搜索 首先,我们在做一个门户网站的时候,前端肯定是要进行搜索的,但是如果搜索的类型比较多的话,怎么做才能一目了然的,这样就引出了组合搜索的这个案例 ...

  7. 04: 使用BeautifulSoup封装的xss过滤模块

    目录: 1.1 xss攻击简介 1.2 xss攻击解决方法 1.1 xss攻击简介返回顶部 1.简介 1. 跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS. ...

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

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

  9. Bypass xss过滤的测试方法

    0x00 背景 本文来自于<Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters>其中的byp ...

  10. xss 过滤

    一. xss过滤 用户通过Form获取展示在终端, 提交数据,Form验证里面加入xss验证(对用户提交的内容验证是否有关键标签) from django.conf.urls import url f ...

随机推荐

  1. pat 1036

    1036. 跟奥巴马一起编程(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 美国总统奥巴马不仅呼吁所有人 ...

  2. Android中如何截取字符串中某个字符之前或之后的字符串

    代码改变世界 Android中如何截取字符串中某个字符之前或之后的字符串 //截取#之前的字符串 String str = "sdfs#d"; str.substring(0, s ...

  3. 项目记事【SpringMVC-2】:将后台的对象,转成JSON报文

    Spring版本:3.2.7 Jackson版本: <!--Jackson --> <dependency> <groupId>com.fasterxml.jack ...

  4. HDU——1596find the safest road(邻接矩阵+优先队列SPFA)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. 第一次使用HTML

    1.第一次使用HTML <title>第一次使用HTML</title></head><body>hello,HTML2.文本处理 <title& ...

  6. outline:0与outline:none区别

    outline:0与outline:none的效果完全一样,用哪个都行,为了少写几个字,提倡用outline:0.具体区别如下: 出处: https://stackoverflow.com/quest ...

  7. 【CCF】高速公路 tarjan强连通缩点

    [题意] 给定一个有向图,问图中互相可达(强连通)的点有多少对 [AC] 强连通缩点,缩点后是一个DAG,所以互相可达的点只在强连通块里. #include<iostream> #incl ...

  8. 怎样抓获或忽略像control-C这样的键盘中断?

    基本步骤是调用signal():#include <signal.h>singal(SIGINT, SIG_IGN); 就可以忽略中断信号, 或者:extern void func(int ...

  9. 【CF1020C】Elections(贪心)

    题意: Berland地区的腐败现象非常常见. 马上有一场选举,你事先知道了选民和政党的数量,分别为 n 和 m ,对于每一位选民,你知道他将要选举哪一个政党, 不过,每一位选民都会在接受一定数额的金 ...

  10. springboot整合mybatis(SSM开发环境搭建)

    0.项目结构: ---------------------方法一:使用mybatis官方提供的Spring Boot整合包实现--------------------- 1.application.p ...