作为一位前端老鸟,总结一下web前端安全领域基础概念防御策略框架实践新兴技术等几个维度的考虑。

一、基础概念与核心漏洞

1.XSS 攻击

XSS跨站脚本攻击)是 Web 前端安全中最常见的威胁之一,其核心是攻击者将恶意脚本注入到网页中,当用户访问该网页时,脚本被执行,从而窃取用户信息、篡改页面内容等。根据攻击脚本的注入方式和执行时机,XSS 主要分为以下三种类型:

一、存储型 XSS(Persistent XSS)

存储型 XSS 是最危险的 XSS 类型之一,恶意脚本会被永久存储在目标服务器(如数据库、留言板、用户个人资料等)中。当其他用户访问包含该恶意脚本的页面时,脚本会从服务器加载并执行。

攻击场景示例:

某论坛允许用户发布评论,且未对评论内容进行过滤。攻击者在评论区输入:

<script>alert(document.cookie)</script>

该恶意脚本被论坛服务器存储到数据库中。当其他用户浏览该帖子时,服务器会从数据库读取这条评论并渲染到页面上,导致<script>标签内的代码在用户浏览器中执行,窃取用户的 Cookie(可能包含登录凭证)。

二、反射型 XSS(Reflected XSS)

反射型 XSS 的恶意脚本不会被存储,而是通过URL 参数、表单提交等方式传递给服务器,服务器处理后将脚本 “反射” 回页面并执行。其特点是一次性攻击,需诱导用户点击包含恶意脚本的链接。

攻击场景示例:

某网站的搜索功能会将用户输入的关键词显示在结果页,且未过滤输入。攻击者构造如下 URL:

https://example.com/search?keyword=<script>alert('XSS')</script>

当用户点击该链接时,服务器会将keyword参数的值直接嵌入到页面中,导致<script>标签内的代码执行,弹出 “XSS” 提示。若脚本更复杂(如发送用户信息到攻击者服务器),则可能造成信息泄露。

三、DOM 型 XSS(DOM-based XSS)

DOM 型 XSS 与前两种类型的区别在于:恶意脚本的执行不经过服务器处理,而是通过浏览器的 DOM 解析直接触发。攻击者利用页面中 JavaScript 对 DOM 的操作漏洞(如使用innerHTML、document.write等方法处理不可信数据),注入恶意代码。

攻击场景示例:

某网站的 JavaScript 代码会从 URL 的hash部分读取内容并插入到页面中:

var userInput = location.hash.slice(1); // 获取URL中#后的内容
document.getElementById('content').innerHTML = userInput; // 将内容插入页面

攻击者构造如下链接诱导用户点击:

https://example.com/page#<img src=x onerror=alert(document.cookie)>

用户点击后,浏览器解析 URL 时,location.hash的值为<img src=x οnerrοr=alert(document.cookie)>,JavaScript 代码会将该内容通过innerHTML插入页面,导致onerror事件触发,执行恶意代码窃取 Cookie。

反射型 XSS 攻击与 DOM 型 XSS攻击 的核心区别是什么?防御方式有何不同?

反射型 XSS 与 DOM 型 XSS 虽然都属于跨站脚本攻击,但在攻击路径触发机制防御策略上存在本质区别,具体如下:

一、反射型 XSS 攻击与 DOM 型 XSS攻击核心区别
1. 攻击路径不同

反射型 XSS:恶意脚本的执行依赖服务器参与。
攻击者构造的恶意脚本会作为请求参数(如 URL 参数、表单数据)发送到服务器,服务器处理后将脚本 “反射” 到响应页面中,最终在用户浏览器中执行。
流程:攻击者构造恶意 URL → 用户访问 → 服务器解析参数并返回含恶意脚本的页面 → 浏览器执行脚本

DOM 型 XSS:完全在客户端(浏览器)完成,不经过服务器处理。
恶意脚本通过 URL 等方式传入后,直接被页面中的 JavaScript 代码读取并操作 DOM(如通过 innerHTML、eval 等方法),导致脚本执行。
流程:攻击者构造恶意 URL → 用户访问 → 浏览器解析 URL 并执行本地 JS → JS 将恶意脚本插入 DOM → 浏览器执行脚本

2. 数据处理位置不同
  • 反射型 XSS 的恶意数据会经过服务器处理(如嵌入 HTML 响应中),因此在服务器的响应内容中可以直接看到恶意脚本。
  • DOM 型 XSS 的恶意数据从未经过服务器,服务器返回的 HTML 是 “干净的”,恶意脚本仅存在于客户端的 DOM 操作逻辑中。
3. 可见性不同
  • 反射型 XSS 的恶意脚本会出现在服务器返回的 HTML 源码中,通过 “查看页面源代码” 可直接观察到。
  • DOM 型 XSS 的恶意脚本不会出现在原始 HTML 源码中,仅在浏览器执行 JS 后通过 DOM 动态生成,需通过 “检查元素”(查看渲染后的 DOM)才能看到。
二、反射型 XSS 攻击与 DOM 型 XSS攻击防御方式的差异

虽然两者的核心防御原则都是 “对不可信数据进行安全处理”,但防御的侧重点不同:

1. 反射型 XSS 的防御

由于恶意脚本经过服务器处理,防御需在服务器端和客户端共同发力

服务器端过滤 / 转义:对所有用户输入的参数(如 URL 参数、表单数据)进行严格过滤,根据输出场景进行转义(如输出到 HTML 中时,将 < 转义为 &lt;,> 转义为 &gt; 等)。
使用 HTTP 安全头:启用 CSP(内容安全策略),限制页面中脚本的加载和执行来源(如只允许加载本站脚本)。
避免将用户输入直接嵌入 HTML:尽量使用文本节点(如 textContent)而非 innerHTML 输出数据。

2. DOM 型 XSS 的防御

由于恶意脚本仅在客户端处理,防御需聚焦于前端 JavaScript 代码

避免危险的 DOM 操作:禁用或谨慎使用 innerHTML、outerHTML、document.write()、eval() 等可直接执行 HTML / 脚本的方法,优先使用 textContent 等安全 API。
前端输入验证与转义:对从 URL(如 location.search、location.hash)、localStorage 等客户端来源获取的数据,在插入 DOM 前进行转义(如使用 encodeURIComponent 或专用库转义 HTML 特殊字符)。
限制动态代码执行:避免使用 setTimeout(string)、setInterval(string) 等以字符串形式执行代码的方法,改用函数形式(如 setTimeout(() => { ... }))。

为什么 React/Vue 等框架默认能减少 XSS 风险?在使用dangerouslySetInnerHTML或v-html时应注意什么?

React、Vue 等现代前端框架之所以能默认减少 XSS 风险,核心在于它们对动态数据的渲染机制进行了安全设计,从根源上避免了不可信数据被直接解析为 HTML / 脚本。而 dangerouslySetInnerHTML(React)和 v-html(Vue)是框架提供的 “不安全” 接口,用于绕过默认安全机制渲染 HTML,使用时需格外谨慎。

一、React/Vue框架默认减少 XSS 风险的原因

框架通过自动转义动态数据和限制危险的 DOM 操作,从渲染层面阻断了恶意脚本的执行,具体机制如下:

1. 自动转义 HTML 特殊字符

当框架将动态数据(如变量、用户输入)插入到 DOM 中时,会默认将 HTML 特殊字符(如 <>&"' 等)转义为对应的实体编码,避免其被解析为 HTML 标签或脚本。

  • 例如,在 React 中渲染 <div>{userInput}</div> 时,若 userInput 的值为 <script>alert('XSS')</script>,框架会自动将其转义为 &lt;script&gt;alert(&#39;XSS&#39;)&lt;/script&gt;,最终在页面中显示为纯文本,而非可执行的脚本。
  • Vue 中使用 {{ userInput }} 插值时,同样会对内容进行转义,确保动态数据仅作为文本渲染。
2. 避免直接操作危险 DOM API

框架内部通过 Virtual DOM 管理页面渲染,避免了开发者直接使用 innerHTML、document.write 等危险 API(这些 API 是 DOM 型 XSS 的常见诱因)。开发者通过框架提供的声明式语法(如 JSX、模板指令)操作视图,无需手动拼接 HTML,从流程上减少了 XSS 漏洞的产生。

二、使用 dangerouslySetInnerHTML 或 v-html 时的注意事项

dangerouslySetInnerHTML(React)和 v-html(Vue)的作用是将动态数据作为原始 HTML 直接插入到 DOM 中,此时框架会关闭自动转义机制,若使用不当,会直接引入 XSS 风险。使用时需遵循以下原则:

1. 仅对完全可信的数据使用
  • 必须确保插入的 HTML 内容完全由开发者控制(如后端接口返回的经过严格过滤的安全内容),绝对不能包含用户输入的原始数据(如评论、留言、个人资料等不可信内容)。
  • 示例:若后端返回的富文本内容已通过安全过滤(如仅允许 <b>、<i> 等无害标签),可谨慎使用;若内容包含用户提交的原始字符串,则严禁使用。
2. 对不可信内容进行严格过滤和净化

若确实需要插入包含用户输入的 HTML(如允许用户提交有限的富文本),必须通过专业的 HTML 过滤库对内容进行净化,仅保留安全的标签和属性。

  • 推荐工具:DOMPurify(适用于 React、Vue 等所有框架),它能有效过滤恶意标签(如 <script>)、事件属性(如 onclick、onerror)和危险协议(如 javascript:)。
  • 示例(React + DOMPurify):
import DOMPurify from 'dompurify';function MyComponent({ userInput }) {// 净化用户输入的 HTMLconst safeHtml = DOMPurify.sanitize(userInput);return <div dangerouslySetInnerHTML={{ __html: safeHtml }} />;
}
3. 限制允许的标签和属性

即使使用过滤库,也应根据业务需求最小化允许的标签和属性(如富文本场景仅允许 <p>、<img>、<a> 等必要标签,且 <a> 标签仅允许 href 属性,同时过滤 javascript: 协议)。

示例(DOMPurify 配置):

// 仅允许 <b>、<i> 标签和 <a> 标签的 href 属性(且禁止 javascript: 协议)
const safeHtml = DOMPurify.sanitize(userInput, {ADD_TAGS: ['b', 'i', 'a'],ADD_ATTR: ['href'],ALLOW_UNKNOWN_PROTOCOLS: false, // 禁止未知协议ALLOW_JAVASCRIPT_PROTOCOL: false // 禁止 javascript: 协议
});
4. 避免拼接动态数据生成 HTML

绝对不要将用户输入的数据与静态 HTML 拼接后再传入 dangerouslySetInnerHTML 或 v-html,拼接过程中可能因过滤不彻底引入漏洞。

错误示例:

// 危险!拼接用户输入可能导致 XSS
const unsafeHtml = `<div>${userInput}</div>`; 
return <div dangerouslySetInnerHTML={{ __html: unsafeHtml }} />;

React、Vue 等框架通过自动转义动态数据封装危险 DOM 操作,默认阻断了大部分 XSS 攻击路径。而 dangerouslySetInnerHTML 和 v-html 是为特殊场景(如渲染富文本)设计的 “逃生通道”,使用时必须确保内容完全可信或经过严格净化,否则会直接暴露 XSS 风险。核心原则:除非万不得已,否则不使用这些接口;若必须使用,务必通过专业工具过滤所有不可信内容。

总结

三种 XSS 的核心差异在于恶意脚本的 “生命周期” 和执行路径:

  • 存储型:脚本存储在服务器,随页面加载执行;
  • 反射型:脚本通过 URL / 表单传递,经服务器反射后执行;
  • DOM 型:脚本仅在浏览器 DOM 中处理,不经过服务器。

防御 XSS 的核心原则是:对所有不可信数据进行严格过滤和转义(如将<转义为&lt;),避免使用危险的 DOM 操作方法,同时启用 CSP(内容安全策略)限制脚本执行。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eSIM技术深度解析:从物理芯片到数字革命

当苹果公司在2018年首次在iPhone XS系列中引入eSIM技术时&#xff0c;许多用户可能并未意识到这个看似微小的改变将带来怎样的技术革命。从1991年第一张信用卡大小的SIM卡&#xff0c;到今天仅有5mm x 5mm的eSIM芯片&#xff0c;这不仅仅是尺寸的缩小&#xff0c;更是移动通信技…

通俗易懂解释Java8 HashMap

我们来用通俗易懂的方式解释一下 Java 8 中 HashMap 的原理&#xff0c;让你对它的结构、运行机制有清晰的理解。&#x1f333; 什么是 HashMap&#xff1f; HashMap 是 Java 中非常常用的数据结构&#xff0c;用于存储键值对&#xff08;key-value&#xff09;。你可以把它理解…

macOS安装配置Unbound DNS完整指南

文章目录macOS安装配置Unbound DNS完整指南&#x1f3af; 为什么选择Unbound&#xff1f;&#x1f4cb; 系统要求&#x1f680; 安装步骤1. 使用Homebrew安装2. 查看安装信息⚙️ 基础配置1. 备份默认配置2. 创建基础配置文件3. 基础配置内容配置53端口版本&#xff08;高级用户…

学习模板元编程(2)std::true_type/false_type

目录 实现原理 应用场景 条件编译 通过特化和继承&#xff0c;实现std::is_xxx系列 思路 举例 例子1&#xff0c;is_bool 例子2&#xff0c;is_ptr 实现原理 std::true_type/false_type是模板intergral_constant的两种实现&#xff1a; using true_type integral_co…

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models论文阅读笔记

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 摘要 本文探索了思维链&#xff08;chain of thought&#xff09;&#xff0c;即一系列中间推理过程&#xff0c;可以有效地增强大语言模型的复杂推理能力。 在三个大型语言模型上的实验表明&#xff0…

华为核心交换机S7700的内存OID

华为S7700系列交换机 SNMP内存相关OID说明 以下列出了华为S7700核心交换机在SNMP v2c下可用的内存相关OID,包括CPU内存利用率、物理内存总量、已用内存和空闲内存,并给出每个OID的功能描述、数据类型、单位、使用说明等信息。 1. CPU内存利用率(处理器内存占用百分比) OID名…

中州养老Day02:服务管理护理计划模块

本日任务:服务管理的后端开发 1.学习:护理项目 (1)评估开发工期的思路和注意事项 全面熟悉项目,了解项目重点,设置开发优先级 比如,在下面图片的接口文档中版本有1.0,2.0,3.0也就是功能的初代,二代,三代,所以我们在大致浏览所有功能后,要优先关注初代功能的实现 开发计划 …

JavaScript:Ajax(异步通信技术)

一、Ajax 核心概念Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种异步通信技术&#xff0c;核心特点&#xff1a;无刷新更新&#xff1a;无需重新加载整个页面异步处理&#xff1a;后台发送/接收数据不阻塞用户数据格式&#xff1a;支持 XML/JSON/HTML/纯…

leetcode 118. 杨辉三角 简单

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。示例 1:输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows 1 输出: [[1]]提示:1 < numRows…

jmeter--While控制器--循环直到接口响应符合条件

场景描述业务场景&#xff1a;单据计算接口情况&#xff1a;单据计算&#xff0c;调用接口1发起计算&#xff0c;接口2查询计算执行结果jmeter脚本&#xff1a;把接口1和接口2&#xff08;接口2循环调用&#xff0c;直到返回执行完成状态&#xff09;添加到一个事务&#xff0c…

组播 | 不同 VLAN 间数据转发实现逻辑 / 实验

注&#xff1a;本文为 “不同 vlan 间组播数据转发” 相关合辑。 图片清晰度受引文原图所限。 略作重排&#xff0c;如有内容异常&#xff0c;请看原文。 组播 VLAN&#xff1a;解决路由器为不同 VLAN 用户复制多份流量问题 aiaiai010101 于 2018-11-16 22:42:06 发布 一、组…

渗透测试常用指令

互联网设备的开放信息查询网站&#xff1a; https://fofa.info/ https://www.zoomeye.org/ https://quake.360.net/quake/#/index https://x.threatbook.com/v5/mapping https://hunter.qianxin.com/ 目录 一、网络探测与扫描 traceroute whatweb ping fping nc n…

51单片机串行通信的设计原理有哪些?

51单片机是指由美国INTEL公司生产的一系列单片机的总称&#xff0c;这一系列单片机包括了许多品种&#xff0c;如8031&#xff0c;8051&#xff0c;8751&#xff0c;8032&#xff0c;8052&#xff0c;8752等&#xff0c;其中8051是最早最典型的产品&#xff0c;该系列其它单片机…

设计模式十四:适配器模式(Adapter Pattern)

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端期望的另一个接口&#xff0c;使原本不兼容的类可以一起工作。适配器模式的类型类适配器&#xff08;通过多重继承实现&#xff09;对象适配器&#xff08;通…

力扣经典算法篇-38-组合(回溯算法)

1、题干 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2&#xff1a; 输入&#xff1a;…

多人命题系统

目 录 摘 要 Abstract 1 系统概述 1.1 概述 1.2课题意义 1.3 主要内容 2 系统开发环境 2. 1 JAVA简介 2. .2 B/S架构 2.3 SSM三大框架 2.4访问数据库实现方法 2.5 系统对MySQL数据库的两种连接方式 3 需求分析 3.1技术可行性&#xff1a;技术背景…

UDP_千兆光通信(四)Tri Mode Ethernet MAC ip核

Tri Mode Ethernet MAC ip核使用与例程分析 一、 Tri Mode Ethernet MAC ip核功能 二、 Tri Mode Ethernet MAC ip核配置 数据传输速率 主要设置接口 帧滤波功能选择,以及流控选择 三、 Tri Mode Ethernet MAC ip核使用 3.1 ip核接口 3.2 ip核接口说明 3.2.1 tx_ifg_delay 3.2…

Linux网络:多路转接 epoll

Linux网络&#xff1a;多路转接 epoll一、epoll三个接口函数1、epoll_create2、epoll_ctl3、epoll_wait二、epoll的工作原理三、epoll的echo_server1、EpollServer类2、构造函数3、事件循环4、事件派发5、事件处理6、测试四、LT和ET模式1、LT2、ET五、项目代码一、epoll三个接口…

uniapp 微信小程序 列表点击分享 不同的信息

<button open-type"share" plain class"item share" click.stop"shareFn(item)"><text>分享</text> </button>import {onShareAppMessage} from dcloudio/uni-applet shareObj ref({})// 将点击后的分享设置信息 关键…

C# 匿名方法详解

C# 匿名方法详解 引言 在C#编程语言中,匿名方法是使用Lambda表达式创建的没有名称的方法。它们在LINQ查询、事件处理和其他场合中非常有用。本文将详细介绍C#匿名方法的基本概念、语法、使用场景以及优势。 匿名方法的概念 匿名方法是一种无需显式定义名称的方法。在C#中,…