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="30" rows="10"></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

下面是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"  />
</p>
"""
soup = BeautifulSoup(content,‘html.parser‘)     # parser为beautifulsoup4 模块的内置解析块,将html解析成对象
tag = soup.find(name=‘img‘)     # 获取的是img标签,name= 标签名
# print(tag)  #<img  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"  /></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  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注释

时间: 2024-10-23 09:00:36

XSS过滤的相关文章

(转)Bypass xss过滤的测试方法

from wooyun//五道口杀气 · 2014/01/02 19:16 0x00 背景 本文来自于<Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters>其中的bypass xss过滤的部分,前面有根据WAF特征确定是哪个WAF的测试方法给略过了,重点来看一下后面绕xss的一些基本的测试流程,虽说是绕WAF的,但这里还是根据WAF中的正则缺陷来绕过测试方法,并不是协议上问题,所以呢,基本可以通用于

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

Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的. sql注入所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执

一个绕过某SRC厂商三处XSS过滤的payload

前言 在某次src的漏洞挖掘过程中,发现了一个payload绕过了三处xss过滤,个人觉得还是挺有意思的,所以记录一下. 从一个被忽略的self xss说起 在某页面信息如下,我决定对回复内容进行xss测试: 插入一个<img/src=1>以后可以看到标签成功解析: 继续深入测试的时候却发现了问题,我们的payload应该是触发了xss防御机制无法提交成功,所以服务器放回501错误. 开始慢慢探测xss filter的规则,首先我们使用<img/src=1>可以,<img/s

Bypass xss过滤的测试方法

0x00 背景 本文来自于<Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters>其中的bypass xss过滤的部分,前面有根据WAF特征确定是哪个WAF的测试方法给略过了,重点来看一下后面绕xss的一些基本的测试流程,虽说是绕WAF的,但这里还是根据WAF中的正则缺陷来绕过测试方法,并不是协议上问题,所以呢,基本可以通用于其他xss过滤的场景.方便新手们比较快速的了解到测试xss的一些基本的方法.

php xss过滤

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入当中Web里面的html代码会被运行,进而达到某些人的攻击目的. 比如在有get接收的链接后面加入?id=19"><div+style%3Dwidth%3Aexpression(alert(42873))> 会导致页面错乱,甚至还会有弹出框! 以下是thinkphp里面的一段代码.用于过滤xss ThinkPHP\Code\Th

增加Xss过滤步骤

1.往项目web.xml中增加以下的代码: <!-- xss param过滤开始 bgy 2014-12-25 --> <filter>  <filter-name>XssFilter</filter-name>  <filter-class>com.jf.app.utils.XssFilter</filter-class> </filter> <filter-mapping>  <filter-name

xss过滤函数

XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. 比如这些代码包括HTML代码和客户端脚本. function remove_xss($string) { $string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $string); $parm1 = Array('javascript', 'vbscript', 'expression', 'applet'

JAVA覆写Request过滤XSS跨站脚本攻击

注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. 尤其是有富文本编辑器的产品.xss可能出现在http的head,不说别的,新浪多次出现. xss可以出现在post数据的正文.图片的url. 于是各种Xss横行,如今Xss跨站脚本漏洞的流行程度甚至超过了当年的sql. 那么对于JAVA语言,如何防御呢. 笔者分享一个思路:所有的web项目,所有的

Java Filter过滤xss注入非法参数的方法

http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: [html] view plain copy <filter> <filter-name>XSSFiler</filter-name> <filter-class> com.paic.mall.web.filter.XssSecurityFilter </filter-c