前端防范 XSS(跨站脚本攻击)

目录

一、防范措施

1.layui util

 核心转义的特殊字符

示例

2.js-xss.js库

安装

1. Node.js 环境(npm/yarn)

2. 浏览器环境

核心 API 基础使用

1. 基础过滤(默认规则)

2. 自定义过滤规则

(1)允许特定标签

(2)允许特定属性

(3)自定义标签处理

(4)自定义属性处理

(5)转义特定字符

常见场景示例

1. 过滤用户输入的评论内容

2. 允许特定富文本标签(如富文本编辑器内容)

注意事项

更多配置


XSS(跨站脚本攻击)是一种常见的网络攻击手段,它允许攻击者将恶意脚本注入到其他用户的浏览器中。XSS攻击通常发生在用户浏览网页时,攻击者通过在网站表单、评论区、URL参数等地方插入恶意脚本代码,当其他用户访问该页面时,这些脚本就会在用户的浏览器中执行。那该如何预防呢,一般是对输入框输入的内容数据进行验证和清理,确保不包含任何可执行的脚本代码。

一、防范措施

可自行封装一个防范XSS攻击的方法,这种较为自由,能根据项目需求自定义防范标准,当然也可以借用相关的工具库,更加方便,下面我为大家整理了相关工具的用法。

1.layui util

layui Util 提供的 layui.util.escape() 是核心的 XSS 防护方法,其核心作用是对 HTML 中的特殊字符进行转义处理,会将具有潜在危险的特殊字符转换为对应的 HTML 实体,从而阻止恶意脚本被浏览器解析执行,从根源上防范大部分反射型、存储型 XSS 攻击。

 核心转义的特殊字符

该方法会针对性转义 HTML 中最具危险性的特殊字符,核心转义规则如下:

原始特殊字符转义后的 HTML 实体说明
<&lt;小于号,HTML 标签开始标识
>&gt;大于号,HTML 标签结束标识
"&quot;双引号,属性值包裹标识
'&#39;单引号,属性值包裹标识
&&amp;和号,HTML 实体的起始标识

这些字符是构建 HTML 标签、属性的关键,恶意攻击者常通过注入包含这些字符的脚本(如 <script>alert('XSS')</script>)来实施攻击,转义后这些脚本会变成纯文本,无法被浏览器解析执行。

示例
layui.use('util', function(){ var util = layui.util; // 模拟用户输入的恶意内容(含XSS脚本) var maliciousContent = '<script>alert("XSS攻击");</script><a href="javascript:evil()">恶意链接</a>'; // 使用escape方法进行XSS转义 var safeContent = util.escape(maliciousContent); // 输出结果(已转为安全的HTML实体) console.log(safeContent); // 输出:&lt;script&gt;alert(&quot;XSS攻击&quot;);&lt;/script&gt;&lt;a href=&quot;javascript:evil()&quot;&gt;恶意链接&lt;/a&gt; // 将转义后的内容插入页面(仅显示为纯文本,不会执行脚本) document.getElementById('content').innerText = safeContent; });

2.js-xss.js库

js-xss 是一个用于防范 XSS(跨站脚本攻击)的 JavaScript 库,能够过滤 HTML 字符串、移除危险标签 / 属性,确保输出的 HTML 安全可渲染。以下是 js-xss 的详细用法,包括安装、基础使用、自定义规则、常见场景等。

安装
1. Node.js 环境(npm/yarn)
# npm npm install xss --save # yarn yarn add xss 
2. 浏览器环境

直接引入 CDN 或本地文件:

<!-- CDN --> <script src="https://cdn.jsdelivr.net/npm/xss/dist/xss.min.js"></script> <!-- 本地(下载后) --> <script src="path/to/xss.min.js"></script> 
核心 API 基础使用

js-xss 的核心是 xss() 函数,传入需要过滤的字符串,返回安全的 HTML。

1. 基础过滤(默认规则)

默认规则会移除所有危险标签(如 <script><iframe>)和危险属性(如 onclickonload),保留常规标签(如 <div><p>)。

// Node.js 环境 const xss = require('xss'); // 浏览器环境直接使用全局变量 xss // 待过滤的危险字符串 const dangerousHtml = ` <div onclick="alert('xss')">点击我</div> <script>stealData()</script> <img src="x" onerror="alert(1)"> `; // 过滤 const safeHtml = xss(dangerousHtml); console.log(safeHtml); // 输出(危险内容被移除): // <div>点击我</div> // <img src="x"> 
2. 自定义过滤规则

通过配置选项自定义规则,满足个性化需求(如允许特定标签 / 属性、自定义标签处理逻辑)。

(1)允许特定标签
const safeHtml = xss(dangerousHtml, { // 白名单:仅允许 div、p、img 标签(默认白名单包含大部分常规标签) whiteList: { div: [], // [] 表示允许该标签,但不允许任何属性 p: ['class'], // 允许 p 标签的 class 属性 img: ['src', 'alt'] // 允许 img 标签的 src、alt 属性 } }); 
(2)允许特定属性
const html = '<div onclick="alert(1)">内容</div>'; const safeHtml = xss(html, { whiteList: { div: ['class', 'data-id'] // 允许 div 的 class 和 data-id 属性,移除 onclick } }); console.log(safeHtml); // 输出:<div>内容</div> 
(3)自定义标签处理

通过 onTag 钩子自定义标签的过滤逻辑:

const safeHtml = xss(dangerousHtml, { onTag: function(tag, html, options) { // 禁止所有 h1 标签,直接返回空 if (tag === 'h1') return ''; // 其他标签按默认规则处理 return undefined; } }); 
(4)自定义属性处理

通过 onTagAttr 钩子自定义属性的过滤逻辑:

const html = '<a href="javascript:alert(1)">链接</a>'; const safeHtml = xss(html, { onTagAttr: function(tag, name, value, isWhiteAttr) { // 处理 a 标签的 href 属性,过滤 javascript: 伪协议 if (tag === 'a' && name === 'href') { if (value.startsWith('javascript:')) { return 'href="#invalid"'; // 替换为无效链接 } } // 其他属性按默认规则处理 return isWhiteAttr ? `${name}="${xss.escapeAttrValue(value)}"` : ''; } }); console.log(safeHtml); // 输出:<a href="#invalid">链接</a> 
(5)转义特定字符

默认会转义 <>&"' 等字符,也可自定义转义规则:

const safeHtml = xss('<p>hello & world</p>', { escapeHtml: function(html) { // 自定义转义:仅转义 & 和 < return html.replace(/&/g, '&amp;').replace(/</g, '&lt;'); } }); console.log(safeHtml); // 输出:<p>hello &amp; world</p> 
常见场景示例
1. 过滤用户输入的评论内容
// 假设用户提交的评论包含危险代码 const userComment = ` <p>我的评论</p> <script>偷取cookie</script> <img src=x onerror="alert('xss')"> `; // 过滤后渲染 const safeComment = xss(userComment, { whiteList: { p: ['class'], img: ['src', 'alt'] // 仅允许 img 的 src 和 alt 属性 } }); // 插入到页面 document.getElementById('comment').innerHTML = safeComment; 
2. 允许特定富文本标签(如富文本编辑器内容)
// 富文本允许的标签和属性 const richTextWhiteList = { h1: ['class'], h2: ['class'], p: ['class', 'style'], a: ['href', 'target', 'class'], img: ['src', 'alt', 'class', 'width', 'height'], strong: [], em: [] }; const richText = '<p>富文本内容<a href="javascript:alert(1)">危险链接</a></p>'; const safeRichText = xss(richText, { whiteList: richTextWhiteList, // 允许 style 属性的特定值(需配合 onTagAttr 过滤) onTagAttr: function(tag, name, value) { if (tag === 'p' && name === 'style') { // 仅允许 color 样式 if (/^color:\s*[a-zA-Z0-9#]+;?$/.test(value)) { return `style="${value}"`; } return ''; } if (tag === 'a' && name === 'href') { // 过滤 a 标签的 javascript: 伪协议 if (value.startsWith('javascript:')) { return 'href="#"'; } return `href="${value}"`; } return `${name}="${value}"`; } }); 
注意事项
  1. 不要完全依赖默认规则:根据业务场景自定义白名单,避免允许不必要的标签 / 属性。
  2. 富文本处理需谨慎:富文本编辑器可能允许更多标签,需精细化配置白名单和属性过滤。
  3. 服务端 + 客户端双重过滤:客户端过滤提升用户体验,服务端过滤是最后一道防线(防止绕过客户端过滤)。
  4. 特殊场景例外:如果需要允许部分安全的脚本(如第三方插件),需通过严格的白名单和校验,避免直接放行。
更多配置

js-xss 的完整配置项可参考官方文档:js-xss,核心配置包括:

  • whiteList:标签白名单(默认值参考源码)。
  • onTag:标签处理钩子。
  • onTagAttr:属性处理钩子。
  • onIgnoreTag:忽略标签时的钩子。
  • onIgnoreTagAttr:忽略属性时的钩子。
  • escapeHtml:自定义转义函数。
  • safeAttrValue:是否过滤属性值中的危险内容。

通过灵活配置,js-xss 可适配绝大多数 XSS 防护场景,是前端 / Node.js 中防范 XSS 的较为推荐的工具之一。

前端虽有xss防护,但是主要还需有后端的一起配合,

不要仅依赖「前端过滤」:攻击者可通过 Postman 等工具直接请求接口,后端必须过滤。

Read more

前端动画库:让你的网站动起来

前端动画库:让你的网站动起来 毒舌时刻 前端动画?这不是用CSS就够了吗? "CSS动画简单,我只用CSS"——结果复杂动画难以实现, "JavaScript动画性能差,我不用"——结果交互体验差, "Framer Motion?GSAP?没听说过,肯定不如CSS"——结果错过了更强大的动画能力。 醒醒吧,前端动画不是简单的CSS过渡,而是需要根据场景选择合适的工具! 为什么你需要这个? * 用户体验:流畅的动画提升用户体验 * 交互反馈:动画可以提供清晰的交互反馈 * 视觉吸引力:动画让网站更具视觉吸引力 * 品牌识别:独特的动画风格可以强化品牌识别 反面教材 /* 反面教材:过度使用CSS动画 */ .animation { /* 复杂的CSS动画,难以维护 */ animation: rotate 2s linear infinite, scale 1s ease-in-out infinite

安利一款超实用的前端可视化打印设计器:Vue Print Designer

安利一款超实用的前端可视化打印设计器:Vue Print Designer

做前端开发的朋友应该都懂,业务开发中遇到打印需求真的头大 —— 手写分页逻辑繁琐、不同框架适配麻烦、票据 / 快递单这类定制化打印场景不好实现,找个趁手的打印插件更是难上加难。最近发现了一款开源的可视化打印设计器Vue Print Designer,完美解决了这些痛点,不管是快速开发还是企业级定制化需求都能满足,今天就跟大家详细聊聊这款工具。 一、Vue Print Designer 是什么? Vue Print Designer 是一款面向业务表单、标签、票据、快递单等打印场景的可视化设计器,核心主打模板化、变量化设计,还提供了静默打印、云打印能力,同时支持 PDF / 图片 / Blob 等多种导出方式,完全能覆盖日常开发中的各类打印需求。 它不是简单的打印插件,而是一套完整的打印解决方案,从可视化设计模板,到参数配置、多端打印,再到定制化扩展,一站式搞定,而且项目还在持续更新,最新版本已经支持英寸、厘米作为单位,对国际化和精细化设计更友好了。 项目地址:https://gitee.com/

ReAct Agent 与 Agent 编排:从单 Agent 闭环到多 Agent 协作(纯享版)

ReAct Agent 与 Agent 编排:从单 Agent 闭环到多 Agent 协作(纯享版)

ReAct Agent 与 Agent 编排:从单 Agent 闭环到多 Agent 协作 本篇文章,大概会花费你10分钟时间,带你对Agent进行更加深入的了解。 目录: * ReAct Agent 与 Agent 编排:从单 Agent 闭环到多 Agent 协作 * 一、这 10 分钟到底会讲什么 * 二、我将会分8节来讲 * 第 1 节:为什么要讲 ReAct 和 Agent 编排 * 时间:1 分钟 * 第 2 节:先讲清 Agent 的最小运行时骨架 * 时间:1 分钟

《C++ Web 自动化测试实战:常用函数全解析与场景化应用指南》

《C++ Web 自动化测试实战:常用函数全解析与场景化应用指南》

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 元素定位:自动化测试的 “精准导航” * 1.1 cssSelector:简洁高效的选择器 * 1.2 xpath:灵活强大的路径语言 * 二. 测试对象操作:定位后的 “核心动作” * 2.1 点击与提交:触发页面交互 * 2.2 文本输入与清除:模拟用户输入 * 2.3 文本与属性获取:验证测试结果 * 三. 窗口与弹窗控制:解决 “多窗口与弹窗干扰” * 3.1 窗口控制:句柄是关键 * 3.