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

Vue: v-html安全性问题

一、问题描述

在这里插入图片描述

可能都知道使用v-html插入富文本,存在安全隐患,比如 cross-site scripting attack(xss)。但具体什么情况下v-html会引发安全问题呢?是否内容中含有<scrpit>标签就会触发执行脚本呢?

二、问题探究

写个简单的代码来看看:

<template><div v-html="content" />
</template>
<script setup lang="ts">
const content = `<script>alert('XSS Attack')<\/script>`
</script>

在这里插入图片描述

可以看到script节点成功的插入文档,但页面并没有出现相应的弹框。通过文档可以看到v-html是通过修改innerHtml来实现的,当然也可以从源码里看到:

在这里插入图片描述

那么换成innerHTML的方式动态插入试试:

在chrome DevTools中的元素面板下选中目标节点,在控制台中输入:

const name = "<script>alert('XSS Attack')</script>";
$0.innerHTML = name; 

可以发现依然没有任何作用,那是因为在HTML标准中规定使用innerHtml插入script标签时不会执行里面的任何代码:

Although this may look like a cross-site scripting attack, the result is harmless. HTML specifies that a <script> tag inserted with innerHTML should not execute.

但这并不代表这种动态插入的方式没有安全问题:

<template><div v-html="content" />
</template>
<script setup lang="ts">
const content = `<img src=x οnerrοr="alert('XSS Attack')">`
</script>

可以看到终于出现了:
在这里插入图片描述

三、解决方案

为了避免v-html潜在的安全隐患,可以使用dompurify(先安装dompurify):

DOMPurify sanitizes HTML and prevents XSS attacks. You can feed DOMPurify with string full of dirty HTML and it will return a string (unless configured otherwise) with clean HTML. DOMPurify will strip out everything that contains dangerous HTML and thereby prevent XSS attacks and other nastiness. It’s also damn bloody fast. We use the technologies the browser provides and turn them into an XSS filter. The faster your browser, the faster DOMPurify will be.

使用方法:

<template><div v-html="content" />
</template>
<script setup lang="ts">
import DOMPurify from 'dompurify';
const content = DOMPurify.sanitize(`<img src=x οnerrοr="alert('XSS Attack')">`)
</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用redis模拟cookie-session,例子:实现验证码功能
  • 在线考试系统应用场景分析
  • MVP的推导过程
  • 养宠家庭除浮毛必入!希喂、安德迈、有哈宠物空气净化器真实对比
  • Rustrover、IDEA 的 Rust 类型不显示(已解决)
  • 4岁患儿玩耍误伤眼内起迷“障”,耽误多年成都爱尔公益救助手术焕清晰
  • C#入门篇6(面向对象)
  • 【软件】常用软件教程一:码云(Gitee)使用方法
  • 【GNSS射频前端】MA2769初识
  • uniapp分包
  • SpringBoot集成kafka-监听器手动确认接收消息(主要为了保证业务完成后再确认接收)
  • 隔离操作系统与进程
  • 【源码】IMX6uLL与QT的串口通信
  • 【C++类和对象】类和对象的介绍、this指针以及体会面向对象编程
  • 代码随想录算法训练营第29天 贪心算法 part03| 题目:134. 加油站 、 135. 分发糖果 、860.柠檬水找零 、 406.根据身高重建队列
  • ----------
  • 30秒的PHP代码片段(1)数组 - Array
  • CSS实用技巧干货
  • java中具有继承关系的类及其对象初始化顺序
  • Linux快速复制或删除大量小文件
  • MySQL-事务管理(基础)
  • PhantomJS 安装
  • PHP的Ev教程三(Periodic watcher)
  • Python进阶细节
  • select2 取值 遍历 设置默认值
  • Vue2.x学习三:事件处理生命周期钩子
  • zookeeper系列(七)实战分布式命名服务
  • 后端_MYSQL
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 浅谈web中前端模板引擎的使用
  • 入口文件开始,分析Vue源码实现
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 我有几个粽子,和一个故事
  • 原生Ajax
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云服务器如何修改远程端口?
  • # 透过事物看本质的能力怎么培养?
  • (备份) esp32 GPIO
  • (接口封装)
  • (理论篇)httpmoudle和httphandler一览
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十) 初识 Docker file
  • (十二)Flink Table API
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)http-server应用
  • (转)创业家杂志:UCWEB天使第一步
  • (轉貼) UML中文FAQ (OO) (UML)
  • ******之网络***——物理***
  • .NET Micro Framework初体验
  • .net web项目 调用webService
  • .NET 常见的偏门问题
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET+WPF 桌面快速启动工具 GeekDesk