关于Web前端安全之XSS攻击防御增强方法

仅依赖前端验证是无法完全防止 XSS的,还需要增强后端验证,使用DOMPurify净化 HTML 时,还需要平衡安全性与业务需求。

一、仅依赖前端验证无法完全防止 XSS 的原因及后端验证的重要性

1. 前端验证的局限性

前端验证(如 JavaScript 输入检查)可以提升用户体验,但无法作为安全防护的核心,原因如下:

前端代码可被篡改:

攻击者可通过浏览器开发者工具禁用或修改前端验证逻辑,直接向服务器发送恶意数据。

绕过前端提交:

攻击者可通过 curl、Postman 等工具直接构造 HTTP 请求,完全绕过前端页面的验证逻辑。

场景覆盖不全:

前端验证可能仅针对可见输入(如表单),而忽略其他数据来源(如 URL 参数、Cookie、第三方接口返回数据)。

2. 后端验证的核心价值

后端验证是防御 XSS 的最后一道防线,其重要性体现在:

不可绕过性:

所有用户输入(无论来源)最终都需经过服务器处理,后端验证可确保恶意数据在进入存储或渲染流程前被拦截。

一致性:

后端验证可统一处理多端(Web、App、第三方接口)的输入,避免因前端实现差异导致的防护漏洞。

全生命周期防护:

后端验证不仅覆盖输入阶段,还能在数据存储、跨系统传输、渲染输出等全流程中生效,确保数据始终处于安全状态。

二、三种常见的 HTML 转义方法及适用场景

1.HTML 实体转义(核心转义)

  • 转义规则:将 < 转为 &lt;,> 转为 &gt;,& 转为 &amp;," 转为 &quot;,' 转为 &#39;。
  • 适用场景:所有动态数据插入 HTML 标签内容或属性时(如 <div>{{ 转义后的数据 }}</div> 或 <input value="{{ 转义后的数据 }}">)。
  • 示例:用户输入 <script>alert(1)</script> 转义后变为 &lt;script&gt;alert(1)&lt;/script&gt;,仅作为文本显示。

2.encodeURIComponent

  • 作用:对 URL 中的参数进行编码,将特殊字符(如 ?、&、=、空格等)转换为 %XX 形式的 URL 编码。
  • 适用场景:动态生成 URL 参数时(如拼接查询字符串、跳转链接)。
  • 示例:用户输入 a&b=c 经 encodeURIComponent 处理后变为 a%26b%3Dc,避免破坏 URL 结构或注入恶意参数。

3.textContent(DOM API 安全输出)

  • 作用:通过 JavaScript 的 textContent 属性设置元素内容,自动将所有内容视为纯文本,不解析 HTML。
  • 适用场景:前端动态插入文本内容时(替代 innerHTML)。
  • 示例:element.textContent = userInput 会将 <script> 直接显示为文本,而非执行脚本。

三、使用 DOMPurify 时平衡安全性与业务需求的策略

DOMPurify 是一款强大的 HTML 净化库,可过滤恶意标签和属性,但业务中常需允许特定标签(如富文本中的 <b>、<img>)。平衡两者的核心是最小权限原则:仅开放必要功能,同时严格限制风险点。

1. 基础配置:默认严格模式

DOMPurify 默认已过滤绝大多数危险内容(如 <script>、onclick、javascript: 协议),直接使用即可覆盖大部分场景:

import DOMPurify from 'dompurify';const safeHtml = DOMPurify.sanitize(userInput); // 默认配置:过滤危险内容

2. 允许特定标签和属性(按需开放)

若业务需要支持富文本(如允许 <b>、<i>、<a>、<img>),可通过配置精细控制:

// 允许 <b>、<i>、<a>、<img>,并限制 <a> 和 <img> 的属性
const safeHtml = DOMPurify.sanitize(userInput, {ADD_TAGS: ['b', 'i', 'a', 'img'], // 额外允许的标签(默认已允许部分安全标签)ADD_ATTR: ['href', 'src', 'alt'], // 额外允许的属性ALLOW_UNKNOWN_PROTOCOLS: false,   // 禁止非标准协议(如 javascript:)ALLOW_SELF_CLOSE_IN_ATTR: false,  // 禁止属性中的自闭合语法(避免绕过)// 限制 <a> 标签的 href 仅允许 http/https 协议CHECK_PROTOCOL: true,// 自定义过滤逻辑:例如限制 <img> 的 src 仅来自可信域名beforeSanitizeElements: (node) => {if (node.tagName === 'IMG' && node.src) {const allowedDomains = ['trusted-cdn.com', 'example.com'];const srcDomain = new URL(node.src).hostname;if (!allowedDomains.includes(srcDomain)) {node.src = ''; // 清空不可信图片地址}}}
});

3. 禁止高风险功能

无论业务需求如何,必须禁用以下高风险特性:

  • 事件属性(onclick、onerror、onload 等):可能触发恶意脚本。
  • javascript:、data: 等危险协议:避免通过 <a href="javascript:xxx"> 执行脚本。
  • iframe、video 等嵌入标签:除非明确信任来源,否则禁止使用。

4. 定期更新与测试

  • 保持 DOMPurify 版本最新,及时修复已知漏洞。
  • 对业务允许的标签和属性进行安全测试(如尝试注入 onerror 事件),验证过滤效果。

总结

  • 前端验证仅为辅助,后端验证是 XSS 防御的核心,因其不可绕过且覆盖全流程。
  • HTML 实体转义、encodeURIComponent、textContent 分别适用于 HTML 内容、URL 参数、前端文本插入场景。
  • 使用 DOMPurify 时,需通过最小权限配置允许必要标签,同时禁用高风险特性,并结合业务测试确保安全与功能的平衡。

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

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

相关文章

消息系统技术文档

消息系统技术文档 概述 本文档详细说明了如何在现有的LHD通信系统中添加自己的消息类型&#xff0c;包括消息的发送、接收、解析和处理的完整流程。 系统架构 消息流程架构图 #mermaid-svg-My7ThVxSl6aftvWK {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情数据可视化分析-热词情感趋势树形图

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解微博舆情数据可视化分析-热词情感趋势树形图…

8月4日 强对流天气蓝色预警持续:多地需警惕雷暴大风与短时强降水

中央气象台8月4日10时继续发布强对流天气蓝色预警,提醒广大民众注意防范即将到来的恶劣天气。 预警详情: 时间范围: 8月4日14时至5日14时 影响区域: 雷暴大风或冰雹: 西北地区中东部、华北中北部、华南南部等地,风力可达8级以上。 短时强降水: 西北地区中东部、华北、…

C语言数据结构(4)单链表专题2.单链表的应用

1. 链表经典算法——OJ题目 1.1 单链表相关经典算法OJ题1&#xff1a;移除链表元素 1.2 单链表相关经典算法OJ题2&#xff1a;反转链表 1.3 单链表相关经典算法OJ题3&#xff1a;合并两个有序链表 1.4 单链表相关经典算法OJ题4&#xff1a;链表的中间结点 1.5 循环链表…

Shell 脚本发送信号给 C 应用程序,让 C 应用程序回收线程资源后自行退出。

下面分别给出一个 Shell 脚本和 C 程序的例子&#xff0c;实现通过 Shell 脚本发送信号给 C 应用程序&#xff0c;让 C 应用程序回收线程资源后自行退出。原理在 Linux 系统中&#xff0c;我们可以使用信号机制来实现进程间的通信。Shell 脚本可以使用 kill 命令向指定的进程发…

C++入门自学Day6-- STL简介(初识)

往期内容回顾 C模版 C/C内存管理&#xff08;初识&#xff09; C/C内存管理&#xff08;续&#xff09; STL简介&#xff1a; STL 是 C 标准库的重要组成部分&#xff0c;是一个通用程序设计的模板库&#xff0c;用于数据结构和算法的复用。它极大地提升了代码效率、可靠性…

从零开始搞定类与对象(中)

运算符重载1.当运算符被用于类类型的对象时&#xff0c;C语言允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使用运算符时&#xff0c;必须转换成调用对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。2. 运算符重载是具有特殊名字的函…

SpringMVC实战指南:从环境搭建到功能实现全解析

第一章&#xff1a;SpringMVC环境搭建与基础配置1.1 Maven依赖配置在Maven项目中&#xff0c;SpringMVC的依赖配置是开发的第一步。根据Spring官方推荐&#xff0c;以下是SpringMVC 5.3.x版本的Maven依赖配置&#xff1a;<dependencies><!-- Spring MVC核心依赖 -->…

Repo 与 manifest

Manifest&#xff1a;它本身就是一个 git 仓库&#xff0c;其中存放的都是包含仓库和子仓库信息的XML文件。这些文件全部由开发者或者维护者手动配置并自己上传到 git 仓库。另外&#xff1a;Manifest 中的仓库之间的依赖关系 repo 也并不关心。所以它们可以是同级的也可以是包…

深入浅出 RabbitMQ:简单队列实战指南

大家好&#xff0c;我是工藤学编程 &#x1f989;一个正在努力学习的小博主&#xff0c;期待你的关注实战代码系列最新文章&#x1f609;C实现图书管理系统&#xff08;Qt C GUI界面版&#xff09;SpringBoot实战系列&#x1f437;【SpringBoot实战系列】SpringBoot3.X 整合 Mi…

Ubuntu22-Qt Creator-fcitx-中文输入

fcitx在ubuntu系统中路径 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/ /usr/lib/x86_64-linux-gnu/qt6/plugins/platforminputcontexts/ fcitx-qt5-1.2.7 编译 下载链接:https://github.com/fcitx/fcitx-qt5/archive/refs/tags/1.2.7.zip Qt版本:Qt C…

【Java基础|第十三篇】面向对象基础(三)——继承(一)继承的理解,实现,特点……

&#xff08;四&#xff09;面向对象&#xff1a; 5、继承&#xff1a; &#xff08;1&#xff09;理解&#xff1a; 概念&#xff1a; 继承是面向对象的三大特征之一 继承是类与类之间关系的一种&#xff08;是父类与子类的关系&#xff09; 使用场景&#xff1a; 一个类与另…

QGIS绿色版吉林一号切片体验版插件(Jilin1Tiles)更新

吉林一号更新2024年图源了但吉林一号切片体验版插件&#xff08;Jilin1Tiles&#xff09;还没有更新&#xff0c;我修改了一下代码&#xff0c;直接集成到QGIS绿色版中。如下&#xff1a;注意&#xff1a;第一次使用的时候需要选中启用一下插件&#xff1a;需要使用的可以直接下…

git操作命令和golang编译脚本

git子模块信息处理命令git init submodule git submodule updategit取消合并 git merge --abort git reset --hard HEAD{1}bat文件生成二进制set GOOSlinux set GOARCHamd64 go env -w GOFLAGS-modvendor go build -ldflags "-w -s" -ohallapiset GOOSlinux set GOAR…

通往L4之路:构建自我进化的智能驾驶决策大脑

摘要&#xff1a; 本文旨在提出一个超越当前主流“感知-预测-规划”分离式架构的下一代自动驾驶决策系统方案。面对自动驾驶领域最核心的“长尾场景”难题&#xff0c;本文借鉴并升华了一套源于复杂策略制定的决策智能框架&#xff0c;通过构建动态驾驶世界模型&#xff08;Dyn…

AI编程助手:终结996的新希望

引言程序员工作现状与“996”现象的普遍性AI技术快速发展对编程效率的潜在影响核心问题&#xff1a;AI IDE与AI辅助编程能否改变传统开发模式AI IDE与AI辅助编程的核心技术AI IDE的定义与功能&#xff08;代码补全、错误检测、自动重构等&#xff09;AI辅助编程工具&#xff08…

Anthropic 禁止 OpenAI 访问 Claude API:商业竞争与行业规范的冲突

Anthropic 禁止 OpenAI 访问 Claude API&#xff1a;商业竞争与行业规范的冲突 文章来源&#xff1a;Poixe AI 本周&#xff0c;美国 AI 公司 Anthropic 宣布禁止 OpenAI 通过 API 访问其 Claude 系列大模型。这一举动引发了行业对"友好基准测试"与商业竞争边界的热…

区块链 + 物联网落地案例:供应链溯源系统开发全记录

本文详细记录了区块链与物联网技术融合的供应链溯源系统开发全流程。从项目背景出发&#xff0c;阐述传统供应链溯源痛点&#xff0c;介绍系统开发的技术架构设计&#xff0c;包括物联网数据采集层、区块链数据存储层等核心模块&#xff0c;详解硬件选型、智能合约编写、数据上…

Windows环境下Intel Fortran如何安装配置NetCDF

NetCDF(Network Common Data Form)格式,简称nc格式,是一种自描述、与平台无关的二进制数据文件,特别适合多维数据的存储和交换,广泛应用于气象、海洋、地球科学等领域。本文介绍Windows环境下IntelFortran安装配置NetCDF的过程。 一、系统环境及准备工作 1. 系统 Wind…

tcp/udp的socket特点

tcp &#xff1a; 绑定一个 socket 只是用来监听&#xff0c;accept 对每个客户端生成一个 socket 用来维护滑动窗口等。每个客户端用一个 socket 用来维护滑动窗口等。 4 次挥手对应两次 close 的 fin 和返回的 ack。 而三次挥手在 connect 里阻塞完成。 ​udp &#xff1a; 双…