如果说 SQL 注入是黑客拿着大锤去砸服务器的门,那么 XSS 就是黑客给用户寄了一份“带毒的礼物”。
XSS (Cross-Site Scripting),全称跨站脚本攻击。为了不和 CSS (层叠样式表) 弄混,大家习惯叫它 XSS。
它的核心逻辑只有一句话:黑客把一段恶意的代码(JavaScript),伪装成普通的内容(礼物),让你的浏览器(受害者)毫不怀疑地吞下去执行。
💻 一、技术分析:浏览器分不清“话”和“命令”
浏览器的天职是解析 HTML。但在早期的设计中,它有一个致命的弱点:它分不清什么是“文本数据”,什么是“可执行代码”。
1. 正常情况
- 代码: <div>你好,世界</div>
- 浏览器: 哦,这是个 div 标签,里面有一句话叫“你好,世界”。显示出来。
2. XSS 攻击
- 黑客输入: <div>你好,<script>把你的钱转给我</script></div>
- 浏览器:
核心漏洞:网站没有对用户的输入进行“消毒”,直接把黑客写的代码当成网页的一部分,发给了其他用户。
🎁 二、故事场景:两种致命的“礼物”
为了搞懂 XSS 的分类,我们将 网站 比作一个 公共公告栏。
1. 存储型 XSS (Stored XSS) —— “埋在地下的地雷”
这是最危险、最隐蔽的攻击。
-
场景: 一个论坛的留言区。
-
埋雷 (黑客操作):
-
黑客在留言框里写下:楼主好人!<script>偷走访问者的 Cookie</script>。
-
点击“发表”。这条带毒的留言被永久保存在了服务器的数据库里。
-
爆炸 (受害者中招):
-
你是无辜的路人甲,你点开了这个帖子。
-
服务器从数据库里读出黑客的留言,展示给你看。
-
你的浏览器读到那段 <script>,立马执行。
-
后果: 你的身份令牌 (Cookie) 瞬间被发到了黑客的邮箱。你甚至都没感觉到,账号就被盗了。
-
特点: 只要你不删帖,每一个看帖子的人都会中招。
2. 反射型 XSS (Reflected XSS) —— “特制的诱饵”
这种攻击通常需要配合“社会工程学”(骗你点链接)。
-
场景: 一个搜索网站,会把你的关键词显示在页面上(比如:“你搜索的是:关键词”)。
-
下饵 (黑客操作):
-
黑客构造了一个极长的奇怪链接: http://search.com?q=<script>偷走Cookie</script>
-
黑客把这个链接发给你:“快看!这个女明星塌房了!”
-
上钩 (受害者中招):
-
你按捺不住好奇心,点了链接。
-
请求发给服务器,服务器把你搜索的内容(那段代码)反射回来,显示在页面上。
-
你的浏览器看到反射回来的代码,执行,爆炸。
-
特点: 不存数据库,点一次炸一次。
😈 三、XSS 能干什么?
既然黑客能让你的浏览器执行 JS 代码,那他几乎就是上帝:
🛡️ 三、防御:把“礼物”拆开检查
XSS 的根源是**“信任用户的输入”。要防御,就得“不信任一切”**。
1. 转义 (Escape) —— 最核心的防御
永远不要把用户输入的内容直接当 HTML 执行。 要把特殊字符转换成“HTML 实体”。
- 黑客输入: <script>alert(1)</script>
- 转义后: <script>alert(1)</script>
- 浏览器看到: 浏览器知道 < 只是一个小于号符号,不是标签的开始。于是它会乖乖把这段代码当成文本显示出来,而不是执行它。
2. HttpOnly Cookie —— 最后的底裤
给你的敏感 Cookie 加上 HttpOnly 属性。
- 作用: 这个 Cookie 只能通过 HTTP 请求发送,JavaScript 读不到。
- 结果: 即使黑客利用 XSS 执行了 JS 代码,他也拿不到你的 Session ID,无法盗号。
3. CSP (内容安全策略) —— 禁令
网站在 HTTP 头里告诉浏览器:
- “只允许加载我域名下的脚本。”
- “禁止执行页面里的内联 <script>。” 这样即使黑客注入了代码,浏览器也会拒绝执行。
