首页 > 其他分享 >三十二、XSS

三十二、XSS

时间:2024-02-12 23:24:53浏览次数:29  
标签:XSS obj form 三十二 request content tag article

XSSFilter.py

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):
        """
        单例模式
        :param cls:
        :param args:
        :param kwargs:
        :return:
        """
        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()

if __name__ == '__main__':
    html = """<p class="title">
                        <b>The Dormouse's story</b>
                    </p>
                    <p class="story">
                        <div name='root'>
                            Once upon a time there were three little sisters; and their names were
                            <a href="http://example.com/elsie" class="sister c1" style='color:red;background-color:green;' id="link1"><!-- Elsie --></a>
                            <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
                            <a href="http://example.com/tillie" class="sister" id="link3">Tilffffffffffffflie</a>;
                            and they lived at the bottom of a well.
                            <script>alert(123)</script>
                        </div>
                    </p>
                    <p class="story">...</p>"""

    obj = XSSFilter()
    v = obj.process(html)
    print(v)

应用:

@check_login
def add_article(request):
    if request.method == 'GET':
        form = ArticleForm(request=request)
        return render(request, 'backend_add_article.html', {'form': form})
    elif request.method == 'POST':
        form = ArticleForm(request=request, data=request.POST)
        if form.is_valid():
            with transaction.atomic(): # from django.db import transaction
                ...
                content = form.cleaned_data.pop('content')
                content = XSSFilter().process(content)
                models.ArticleDetail.objects.create(content=content, article=obj)
                ...
            return redirect('/backend/article-0-0.html')
        else:
            return render(request, 'backend_add_article.html', {'form': form})
    else:
        return redirect('/')
@check_login
def update_article(request):
  ...
  elif request.method == 'POST':
        form = ArticleForm(request=request, data=request.POST)
        if form.is_valid():
            obj = models.Article.objects.filter(nid=nid, blog_id=blog_id).first()
            if not obj:
                return render(request, 'backend_no_article.html')
            with transaction.atomic():
                content = form.cleaned_data.pop('content')
                content = XSSFilter().process(content)
                tags = form.cleaned_data.pop('tags')
                models.Article.objects.filter(nid=obj.nid).update(**form.cleaned_data)
                models.ArticleDetail.objects.filter(article=obj).update(content=content)
                models.Article2Tag.objects.filter(article=obj).delete()
                tag_list = []
                for tag_id in tags:
                    tag_id = int(tag_id)
                    tag_list.append(models.Article2Tag(article_id=obj.nid, tag_id=tag_id))
                models.Article2Tag.objects.bulk_create(tag_list)
            return redirect('/backend/article-0-0.html')
        else:
            return render(request, 'backend_edit_article.html', {'form': form, 'nid': nid})

标签:XSS,obj,form,三十二,request,content,tag,article
From: https://www.cnblogs.com/zhlforhe/p/18014238

相关文章

  • PHP项目&TP框架&SQL&XSS&架构&路由&调试&写法
    开发基础-TP框架-入口&调试&路由&写法等参考手册-TP5开发手册-为了掌握了解框架首页文件看APP_PATH定义-为了后期分析核心代码全局搜索:THINK_VERSION,为了后期分析此版本是否存在漏洞。参考手册-本地代码案例对比,为了后期分析定位代码块或测试漏洞。配置文件开关(app_debug,a......
  • xss漏洞简介
    xss简介XSS(跨站脚本公鸡)是一种常见的网络安全漏洞,公鸡者通过在受信任的网站上注入恶意脚本,使其在用户浏览器中执行。这些恶意脚本可以窃取用户的敏感信息,如登录凭证、个人信息等,或者进行其他恶意操作。XSS漏洞的原理是公鸡者将恶意脚本注入到受信任的网站中,然后当用户访问该网站时,......
  • NanoFramework操作ESP32(一)_基础元器件篇(三十二)_ KY-002震动传感器
    一、元器件介绍  本开关在静止时为开路(OFF)状态,当受到外力碰触而达到适当震动力时,或移动速度达到适当离(偏)心力时,导电接脚会发生瞬间导通(ON)状态,使电气特性改变,而当外力消失时电气特性恢复开路(0FF)状态。可使用数字信号接收。1、针脚用途编号名称功能1GND电......
  • kali学习笔记-05-DVWA XSS跨站脚本攻击
    kali学习笔记-05-DVWA XSS跨站脚本攻击KaliLinux网络安防一、反射型XSS攻击在OWASP的DVWA上,选中XSSreflected页面,在输入框内输入张三,页面反应正常。尝试输入一句script脚本。<script>alert('xss')</script>出现了如下的系统弹框,也就意味着后端服务器没有对特殊字符做......
  • 防御XSS攻击:DOMPurify不可或缺
    DOMPurify是什么?DOMPurify是一个针对DOM的XSS清理器。 DOMPurify有什么作用?DOMPurify可以清理HTML并防止XSS攻击。你可以用有恶意代码的HTML字符串来测试DOMPurify,它将返回一个带有干净的HTML字符串。DOMPurify将去除所有包含危险HTML的内容,从而防止XSS攻击。 怎么使用D......
  • .NET中使用HtmlSanitizer来有效的防范XSS攻击!
    0X00前言随着互联网的发展,网络安全问题越来越受到关注。XSS攻击作为最常见的网络安全漏洞之一,对企业和用户的信息安全构成严重威胁。.NET开发人员可以使用HtmlSanitizer来有效防范XSS攻击,确保网站的安全性。HtmlSanitizer是一个.NET开源库,用于从可能导致XSS攻击的构造中清除HTM......
  • SpringCloud微服务实战——搭建企业级开发框架(三十二):代码生成器使用配置说明
    一、新建数据源配置  因考虑到多数据源问题,代码生成器作为一个通用的模块,后续可能会为其他工程生成代码,所以,这里不直接读取系统工程配置的数据源,而是让用户自己维护。参数说明数据源名称:用于查找区分数据源的名称连接地址:连接方式:数据库类型:数据库地址等参数,例:jdbc:m......
  • 贪吃蛇game.wxss代码
    /* pages/game/game.wxss */canvas {  height: 600rpx;  width: 600rpx;  border: 1rpx green solid;}.btnBox {  align-items: center;  margin: 40rpx;  display: flex;  flex-direction: column;}.btnBox button{  margin: 10rpx;}......
  • 贪吃蛇login.wxss代码
    /* pages/login/login.wxss *//**app.wxss**/.box1 {  height: 100%;  display: flex;  flex-direction: column;  align-items: center;  justify-content: space-between;  padding: 100rpx 0;  box-sizing: border-box;} image{  width: 150rpx; ......
  • XSS注入测试思路+通用语句
    一、XSS分类第一种:反射型页面仅把用户输入直接回显在页面或源码中,需要诱使用户点击才能成功。第二种:持久型XSS攻击代码会被存储在服务器中,由于用户可能会主动浏览被攻击页面,此种方法危害较大。第三种:DOM型(DOMBasedXSS)通过修改页面的DOM节点形成XSS,严格来讲也可划......