当前位置: 首页 > article >正文

安全地使用v-html

vue2

1、 使用插件DOMPurify

DOMPurify是一个开源的基于DOM的快速XSS净化工具。输入HTML元素,然后通过DOM解析递归元素节点,进行净化,输出安全的HTML

 <div v-html="sanitizedContent"></div>
 
import DOMPurify from 'dompurify'; 
  data () {
    return {
      htmlContent: '<p>Hello, <a href="https://example.com">World</a>!</p>'
    }
  },
  computed: {
    sanitizedContent () {
      return DOMPurify.sanitize(this.htmlContent);
    }
  },

2、手动写过滤函数

<template>
  <div>
    <div v-html="sanitizedContent"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      htmlContent: '<p>Hello, <a href="https://example.com" target="_blank">World</a>!</p>'
    };
  },
  computed: {
    sanitizedContent() {
      return this.sanitizeHTML(this.htmlContent);
    }
  },
  methods: {
    sanitizeHTML(html) {
      //允许的标签
      const allowedTags = ['p', 'a'];
      //允许的标签属性
      const allowedAttributes = ['href'];

      const tempDiv = document.createElement('div');
      tempDiv.innerHTML = html;

      tempDiv.querySelectorAll('*').forEach(element => {
        if (!allowedTags.includes(element.tagName.toLowerCase())) {
          element.remove();
        } else {
          Array.from(element.attributes).forEach(attribute => {
            if (!allowedAttributes.includes(attribute.name)) {
              element.removeAttribute(attribute.name);
            }
          });
        }
      });

      return tempDiv.innerHTML;
    }
  }
};
</script>

属性对象的类型: NamedNodeMap ,表示属性节点 Attr 对象的集合

vue3

  • vue3多了一个方法
    http://www.mobiletrain.org/about/BBS/256788.html
    利用createVNode方法,用递归的方式,创建虚拟DOM,在构建虚拟DOM树之前,可以对输入的HTML内容进行过滤和处理。

http://www.kler.cn/a/272158.html

相关文章:

  • 使用vue-next-admin框架后台修改动态路由
  • Cursor的详细使用指南
  • 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(3.纯python的实惠版)
  • 【Day23 LeetCode】贪心算法题
  • HarmonyOS NEXT:华为分享-碰一碰开发分享
  • 【C++】filesystem 详解
  • 深度学习pytorch——基本运算(持续更新)
  • 微信小程序之tabBar
  • LinkedList源码解析和设计思路
  • 强大的开源网络爬虫框架Scrapy的基本介绍(入门级)
  • 在类Unix平台实现TCP客户端
  • linux ---vim的基本使用
  • 单片机第四季-第二课:uCos2源码-BSP
  • ChatGPT :确定性AI源自于确定性数据
  • UGUI界面性能优化2-最大程度降低UI的DrawCall和重绘
  • RabbitMQ——死信队列和延迟队列
  • windows安装go
  • Xcode 15.3 Archive失败
  • PC电脑如何使用HDMI连接小米电视当显示屏
  • 您能以一半的成本构建像ChatGPT这样的大型语言模型吗?
  • ChatGPT提示词方法的原理
  • Selenium-webdriver_manager判断是否已经下载过驱动(复用缓存驱动)
  • 用python写网络爬虫:3.urllib库进一步的使用方法
  • MySQL_数据库图形化界面软件_00000_00001
  • 一个完整的上传文件示例
  • stable diffusion webui 搭建和初步使用