基于vue搭建的网站如何防范XSS攻击

news2024/12/23 20:21:11

1.对于从接口请求的数据,尽量使用{{}}加载,而不是v-html

ue中的大括号会把数据解释为普通文本。通常如果要解释成html代码则要用v-html。而此指令相当于innerHTML。虽然像innerHTML一样不会直接输出script标签,但也可以输出img,iframe等标签。
vue

2.对用v-html和innerHTML加载的客户信息进行转义

如果显示内容里面有html片段,一定需要用v-html或者innerHTML加载,例如:

<div v-html="`<span>${message}</span>`"></div>

里面的message是客户自己输入的信息,如果此时是恶意的dom片段肯定会引起XSS攻击。此时我们可以对“<”,">"转译成“<”,“>”。然后再输入到页面。

可以使用lodash里面的escape方法对客户信息进行转译。如下

import _escape from 'lodash/escape'
Vue.prototype.$escape = _escape

在vue中插入一个全局方法,对需要转译的数据就使用这个方法:

<div v-html="`<span>${$escape(message)}</span>`"></div>

3.在入口页面的meta中使用CSP

在入口文件的head添加meta标签

<meta http-equiv="Content-Security-Policy" content="script-src 'self';style-src 'self'">

上面的CSP设置表示,script脚本资源和style样式资源只能加载当前域名下的资源。这样子可以避免外部恶意的脚本的加载和执行。

如果页面有例如下面的标签,那这些CDN资源是加载不了的。

<link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/1.0.0/css/font-awesome.css" rel="stylesheet">
<script src='https://cdn.bootcdn.net/ajax/libs/angular.js/0.10.0/angular-ie-compat.js'></script>

题外话:个人不倡议用第三方CDN,其一是不会减少页面加载资源的体积,其二是第三方CDN稳定性不能保证,有时候第三方CDN的服务器会挂掉导致需要的资源加载不了。

一般会用下面的CSP配置:

<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline'">

设置解释:

script-src:只加载当面域名服务器下的资源,且允许eval执行脚本。因为webpack在development模式下大量使用eval进行脚本注入,且在development中常用的souce-map是cheap-module-eval-source-map。如果script-src设置成‘self’会阻止eval的使用。
style-src:只加载当面域名服务器下的资源,且允许使用内联资源。有时候无论在开发环境还是生产环境,可能都是通过webpack打包把CSS内容打包到JS文件里面。加载页面时,JS脚本会在页面中插入一个个style标签补充层叠样式模型。如果style-src设置成‘self’会阻止style内联样式的插入和执行。

4.针对特殊场景,选择性过滤XSS标签

在项目中,XSS的安全漏洞很容易出现,例如在聊天模块和富文本模块很容易出现。

有时候你想实现富文本编辑器里编辑html内容的业务。可是又担心XSS恶意脚本的注入。此时可以使用一个xss工具。网址:https://github.com/leizongmin/js-xss。更详细的用法可以看附上的网址,这里简单说一下用法。

首先下载xss

npm i xss -S

(1)在页面中引入资源且生成XSS过滤器,对内容进行过滤

var xss = require("xss") 
const option={} //自定义设置
const myxss = new xss.FilterXSS(option);
const line='<script type="text/javascript">alert(1);</script>'
var html = myxss.process(line);
console.log(html); //输出:&lt;script type="text/javascript"&gt;alert(1);&lt;/script&gt;

(2)如果我想不过滤img标签的onerror属性,或者不过滤style标签。通过设置whiteList可选择性的保留特定标签及其属性,例如:

const option={
    whiteList:{
        img:['src','onerror'] //img标签保留src,onerror属性
        style:['type'] //style标签默认是不在whileList属性里的,现在添加上去
    }
}
const myxss = new xss.FilterXSS(option);
letline='<img src="./123.png" οnerrοr="alert(1);" alt="123">'
let html = myxss.process(line);
console.log(html); //输出:<img src="./123.png" οnerrοr="alert(1);">
line='<style type="text/css">color:white;</style>'
html = myxss.process(line);
console.log(html); //输出:<style type="text/css">color:white;</style>

xss默认的whiteList可以通过console.log(xss.whiteList)显示。
(3)如果想彻底过滤掉类似script,noscript标签,option可如下设置:

const option={
    stripIgnoreTagBody: ["script","noscript"],
}
const myxss = new xss.FilterXSS(option)
let line='<script type="text/javascript">alert(1);</script>'
let html = myxss.process(line)
console.log(html.length) //输出0,即html被转化为空字符串
line='<noscript>123</noscript>'
html = myxss.process(line)
console.log(html.length) //输出0,即html被转化为空字符串

stripIgnoreTagBody用于设置不在whiteList的标签的过滤方法。例如script,不在whiteList会被执行xss内部的escapeHtml方法。如一开头的例子会把“<”,“>”进行转义。但如果stripIgnoreTagBody中添加了script。则会直接把整个script标签过滤掉。

(4)xss默认生成的过滤器是会过滤掉任何标签的class属性。如果我们不想过滤任何在whiteList的标签的class属性,可以这么设置

const option={
    onIgnoreTagAttr: function(tag, name, value, isWhiteAttr) {
        if (['style','class'].includes(name)) {
            return `${name}="${xss.escapeAttrValue(value)}"`
        }
    },
}
const myxss = new xss.FilterXSS(option);
let line='<div class="box"></div>'
let html = myxss.process(line);
console.log(html); //输出:<div class="box"></div>

onIgnoreAttr方法用于设置白名单中特定属性的过滤方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/652687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产自主GPU架构“天狼星”在北京亮相

GPU&#xff08;Graphic Processing Unit&#xff09;即图形处理器&#xff0c;是数字世界图形内容生成的基石&#xff0c;不管是桌面应用、游戏、电影、数字孪生还是元宇宙&#xff1b;与此同时&#xff0c;强大的并行计算能力业已成为各种应用加速的主流手段&#xff0c;正广…

混淆矩阵和语义分割评价指标

语义分割评价指标 混淆矩阵和评价指标 https://cocodataset.org/#stuff-eval 混淆矩阵&#xff08;Confusion Matrix) 指标公式准确率、正确率 T P T N ТР T N F P F N \frac{TP TN}{ ТР TNFPFN} ТРTNFPFNTPTN​精确率、精度 P T P ТР F P P \frac{TP }{ ТР F…

VLAN基础知识1_整体介绍

目录 1.VLAN概述 2.VLAN帧格式 3.VLAN端口类型 4.缺省VLAN 5.VLAN打标签和去标签 6.VLAN划分的方法 1.VLAN概述 VLAN&#xff08;虚拟局域网&#xff09;是一种逻辑上划分网络设备的技术&#xff0c;用于将单个物理网络划分成多个虚拟网络。VLAN可以将网络中的设备分组&…

uni-app开发壁纸图像小程序 瀑布流、懒加载展示

标题&#xff1a;使用uni-app开发壁纸图像小程序&#xff1a;瀑布流与懒加载展示 引言&#xff1a; 在今天的移动应用市场中&#xff0c;壁纸图像小程序备受欢迎。为了提高用户体验&#xff0c;我们可以使用uni-app框架来开发这样的小程序&#xff0c;并实现瀑布流和懒加载展示…

Mybatis常见问题

Mybatis执行流程 理解各组件的联系Sql的执行过程&#xff08;参数映射&#xff0c;sql解析&#xff0c;执行和处理结果&#xff09;首先通过mybatis-config.xml文件去加载连接数据库的相关配置&#xff0c;加载sql的映射文件 通过mybatis的配置文件然后去构建会话工厂SqlSess…

chatgpt赋能python:Python整数筛选方法

Python整数筛选方法 Python是一种极其强大的编程语言&#xff0c;特别适合用于数据科学和数字计算。在数字计算中&#xff0c;经常需要筛选出指定范围内的整数。下面将介绍几种Python中筛选整数的方法。 1. 利用循环筛选 最简单的方法是使用循环&#xff0c;逐个检查每个数字…

关于Sui x KuCoin Labs夏季黑客松的七个关键信息

为促进Sui生态发展更进一步&#xff0c;Sui与KuCoin Labs联合举办夏季黑客松&#xff0c;希望能聚集全球加密英才&#xff0c;利用Sui产业领先的技术堆栈激荡出新的火花&#xff0c;为加密产业和Sui生态引入新的力量。本次黑客松总奖金达28.5万美元&#xff0c;分为多个赛道&am…

【React】React中编写CSS,Redux

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 React中编写CSS内联样式普通csscss modulescss in js动态添加class ReduxJS纯函数如何创建redux…

MVC 模式及对象持久化

MVC 模式及对象持久化 开发框架简介对象关系映射ORM 技术 Struts2 框架的使用Struts2 框架的下载及部署Struts2 配置 开发框架简介 在了解MVC 之前&#xff0c;首先来了解框架的概念。要理解框架的含义得从开发的实际需求说起。在软件开发过程中总有很多基础的功能是相同或者相…

荣耀MagicBook如何重装系统?荣耀MagicBook重装Win10系统教程

荣耀MagicBook如何重装系统&#xff1f;荣耀MagicBook是一款12小时长续航独显轻薄本&#xff0c;深受用户的喜欢&#xff0c;有些用户想知道如何给荣耀MagicBook重装Win10系统&#xff0c;操作难度不会很大&#xff0c;用户们可以根据小编给大家分享的荣耀MagicBook重装Win10系…

【FPGA零基础学习之旅#8】阻塞赋值与非阻塞赋值讲解

&#x1f389;欢迎来到FPGA专栏~阻塞赋值与非阻塞赋值 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家…

Redis从入门到精通【高阶篇】之底层数据结构跳表(SkipList)

文章目录 0.前言1.跳表(SkipList)基本详解2. 源码解析3.总结4.思考题5. Redis从入门到精通系列文章 0.前言 上个篇章回顾&#xff0c;我们上个章节我们学习了《Redis从入门到精通【高阶篇】之底层数据结构整数集(IntSet)详解》&#xff0c;我们从源码层了解整数集由一个头部和…

Day08 Python数据结构(数据容器)详解

文章目录 第五章 Python数据容器5.1. 容器类型介绍5.2. 数据容器运算符5.2.1. 成员运算符5.2.2. 身份运算符 5.3. 字符串str5.3.1. 字符串的定义5.3.2. 运算符的相关操作5.3.3. 索引和切片5.3.3.1. 索引5.3.3.2. 切片 5.3.4. 字符串遍历5.3.5. 字符串的相关操作5.3.5.1. 获取的…

git安装以及git小乌龟使用

一、下载git 打开git官网地址&#xff1a;https://git-scm.com/进行下载 下载完安装&#xff0c;一直next就好&#xff0c;如果愿意就可以改下安装路径&#xff0c;改在d盘。 具体可以参考&#xff1a;git安装教程 二、安装完下载小乌龟以及语言包 下载地址&#xff1a;小乌龟…

【OpenMMLab AI实战营二期笔记】第六天 目标检测和MMDetection

1.什么是目标检测&#xff1f; 目标检测 vs 图像分类 目标检测的应用 &#xff08;1&#xff09;人脸识别 &#xff08;2&#xff09;智慧城市 &#xff08;3&#xff09;自动驾驶 &#xff08;4&#xff09;下游视觉任务&#xff1a;场景文字识别、人体姿态估计 目标检测技术…

微服务 springcloud 08.zuul框架,API网关,整合ribbon和hystrix框架

01.zuul是作为springcloud中的一个网关框架来使用的。 zuul API 网关&#xff0c;为微服务应用提供统一的对外访问接口。 zuul 还提供过滤器&#xff0c;对所有微服务提供统一的请求校验。 在项目中的位置&#xff1a; 02.新建 sp11-zuul 项目 03.pom.xml 需要添加 sp01-com…

【雕爷学编程】Arduino动手做(111)---震动提醒模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

纺织工厂运营神技,不会你就OUT了!

在纺织工业中&#xff0c;保持适宜的生产环境是至关重要的。温湿度、能耗、设备运行状态以及空气质量等因素对纺织品的质量和生产效率都有着重要影响。 为了实现对生产环境的全面监控和管理&#xff0c;纺织企业越来越多地采用动环监控系统。 客户案例 湖州市某纺织工厂监控项目…

USART2实现Motbus485通信

本文用的单片机是原子的战舰V4 1. 先来驱动一下usart2 USART驱动配置一般步骤: STEP1&#xff1a;使能相关时钟&#xff0c;这块板子usart2用到了A2、A3分别为TX脚、RX脚&#xff0c;D7的作用是发送接收模式控制。下面开启GPIO与USART2时钟&#xff1a; RCC_APB1PeriphClockCm…

SpringBoot中打印 sql 语句

系列文章目录 文章目录 系列文章目录前言一、在配置文件中 application.yml 配置即可二、#Log4g打印SqL语句三、配置Logback总结 前言 在SpringBoot中&#xff0c;我们可以使用日志框架来打印SQL语句&#xff0c;常用的日志框架有Logback和Log4j2。下面以Logback为例&#xff…