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 ...
随机推荐
- Educational Codeforces Round 38 (Rated for Div. 2)
这场打了小号 A. Word Correction time limit per test 1 second memory limit per test 256 megabytes input sta ...
- springMVC 引入静态资源Js的方式
前两天项目出现了Js无法引入的情况,本篇博客先总结分析+批判自己犯的低级错,再说说几种访问静态资源的方式! 首先,由于在web.xml里面的servlet拦截匹配为<url-pattern> ...
- hibernate基础工具findBySQL学习
public List<Map<String,Object>> findBySQL(String sql,Map<String,Object> param,int ...
- jQUery中的$(document).ready()方法和window.onload()方法的区别
1.常规的Javascript代码中,通常使用window.onload方法 window.onload = function(){//代码} 2.jquery中,则使用$(document).rea ...
- ACM程序设计选修课——1040: Alex and Asd fight for two pieces of cake(YY+GCD)
1040: Alex and Asd fight for two pieces of cake Time Limit: 1 Sec Memory Limit: 128 MB Submit: 27 ...
- HDU——1215七夕节(因数和)
七夕节 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- [NOIP2017] 逛公园 (最短路,动态规划&记忆化搜索)
题目链接 Solution 我只会60分暴力... 正解是 DP. 状态定义: \(f[i][j]\) 代表 \(1\) 到 \(i\) 比最短路长 \(j\) 的方案数. 那么很显然最后答案也就是 ...
- 【CF696B】Puzzles(树形DP,期望)
题意:n 个节点的树,初始位置为 1 号节点,初始时间为 1.每次随机地走向任何一个没有走过的子树并且令时间 +1求问走到每一个点时的时间的期望值 思路:比较少见的一道自顶向下的树形DP dp[i]表 ...
- [leetcode]84.Largest Rectangle in Histogram ,O(n)解法剖析
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- CodeForces 141E: ...(最小生成树)
[条件转换] 两两之间有且只有一条简单路径<==>树 题意:一个图中有两种边,求一棵生成树,使得这棵树中的两种边数量相等. 思路: 可以证明,当边的权是0或1时,可以生成最小生成树到最大生 ...