SECURITY · 安全 / 防御 / 最佳实践

Web 安全清单

Web 安全不是可选功能,而是系统的基石。从 XSS 到 SQL 注入,从认证授权到依赖扫描,完整梳理 12 大类 Web 安全威胁的攻防要点,附有代码示例与防御策略,帮你构建纵深防御体系。

12安全大类 36+防御策略 24+代码示例
XSS CSRF SQL 注入 SSRF 文件上传 JWT HTTPS CORS CSP 点击劫持 安全审计 依赖扫描 OWASP CSP SameSite TLS 1.3 RBAC XSS CSRF SQL 注入 SSRF 文件上传 JWT HTTPS CORS
严重 高危 中危 低危 信息
⚠️

XSS 跨站脚本攻击

Critical

攻击者将恶意脚本注入网页,在受害者浏览器中执行。分为存储型(持久化)、反射型(非持久化)和 DOM 型三种。可窃取 Cookie、会话令牌、重定向到恶意站点。

🛡️ 防御策略
对所有用户输入进行输出编码(HTML Entity / JavaScript / URL 编码),实施 Content Security Policy (CSP),使用 HttpOnly Cookie 防止脚本读取,对富文本内容使用安全的 HTML 净化库。
📄 输出编码示例
// JavaScript - HTML 编码
function encodeHTML(str) {
  const map = { '&': '&amp;', '<': '&lt;',
    '>': '&gt;', '"': '&quot;',
    "'": '&#x27;' };
  return str.replace(/[&<>"']/g,
    ch => map[ch]);
}
// Thymeleaf 自动编码:th:text 默认转义
<p th:text="${userInput}"></p>
🔄

CSRF 跨站请求伪造

High

攻击者诱导已认证用户访问恶意页面,利用用户的登录状态向目标网站发送伪造请求,执行非预期的操作(修改密码、转账等)。

🛡️ 防御策略
使用 CSRF Token(服务端生成、表单携带、服务端校验);设置 SameSite Cookie(Lax / Strict);验证 Referer / Origin 头;使用验证码或二次确认。
📄 Spring Boot CSRF 配置
// Spring Security CSRF 默认开启
http.csrf(csrf -> csrf
  .csrfTokenRepository(
    new CookieCsrfTokenRepository())
);

// Thymeleaf 表单中自动注入
<input type="hidden"
  th:name="${_csrf.parameterName}"
  th:value="${_csrf.token}" />
🗄️

SQL 注入

Critical

攻击者在输入中嵌入 SQL 命令,服务端拼接 SQL 语句时被解释执行,导致数据泄露、篡改或删除。是最经典的 Web 安全漏洞之一。

🛡️ 防御策略
始终使用参数化查询(PreparedStatement)或 ORM 框架(MyBatis / JPA / Hibernate);对用户输入进行严格的类型验证和长度限制;部署 WAF 作为额外防护层;最小化数据库账户权限。
📄 参数化查询示例
// ❌ 危险:字符串拼接
String sql = "SELECT * FROM users WHERE name = '"
  + name + "'";

// ✅ 安全:参数化查询
PreparedStatement ps = conn.prepareStatement(
  "SELECT * FROM users WHERE name = ?"
);
ps.setString(1, name);
🌐

SSRF 服务端请求伪造

High

攻击者控制服务端发起请求的目标地址,使服务器向内部网络发起请求,从而访问或攻击内网服务(如 Redis、MySQL、云服务元数据端点)。

🛡️ 防御策略
维护 URL 白名单,禁止访问内网 IP 段(127.0.0.1/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16);禁用协议重定向;限制请求协议为 HTTPS;使用网络策略隔离。
📄 URL 白名单校验
private static final List<String> ALLOWED_HOSTS =
  List.of("api.trusted.com", "cdn.example.com");

public boolean isSafeUrl(String url) {
  try {
    URI uri = new URI(url);
    return ALLOWED_HOSTS.contains(uri.getHost());
  } catch (Exception e) {
    return false;
  }
}
📎

文件上传漏洞

High

攻击者上传恶意文件(WebShell、可执行脚本等)到服务器。若上传目录可执行脚本,攻击者可获取服务器控制权,或利用上传功能传播恶意软件。

🛡️ 防御策略
严格校验文件类型(MIME Type + 魔数签名双重验证);限制文件大小;重命名文件(UUID + 原始扩展名白名单);上传目录禁止执行权限;使用对象存储(OSS/S3)而非本地存储。
📄 Spring Boot 文件校验
public ResponseEntity<?> uploadFile(
    @RequestParam MultipartFile file) {
  String mime = file.getContentType();
  if (!List.of("image/jpeg",
      "image/png").contains(mime)) {
    return ResponseEntity.badRequest().build();
  }
  // 重命名并存储
  String safeName = UUID.randomUUID() + "."
    + getExtension(file.getOriginalFilename());
  // ...
}
🔑

认证与授权

Critical

认证(Authentication)验证身份,授权(Authorization)控制权限。常见方案包括 JWT(无状态令牌)、OAuth 2.0(第三方授权)、RBAC(基于角色的访问控制)。

🛡️ 防御策略
JWT 使用强签名算法(HS256/RS256)并设置短过期时间;OAuth 2.0 使用 PKCE 防授权码拦截;RBAC 遵循最小权限原则;实施多因素认证;口令使用 bcrypt/Argon2 哈希存储。
📄 JWT 生成与验证
// JJWT 库示例
String token = Jwts.builder()
  .setSubject(userId)
  .claim("role", role)
  .setExpiration(new Date(System.currentTimeMillis() + 3600000))
  .signWith(Keys.secretKeyFor(SignatureAlgorithm.HS256))
  .compact();

// 验证
Jwts.parserBuilder().setSigningKey(key)
  .build().parseClaimsJws(token);
🔒

HTTPS & HSTS

High

HTTPS 通过 TLS 协议加密传输数据,防止中间人攻击。HSTS(HTTP Strict Transport Security)强制浏览器始终通过 HTTPS 访问,杜绝协议降级攻击。

🛡️ 防御策略
使用 TLS 1.3(禁用 TLS 1.0/1.1);配置强密码套件;设置 HSTS 头(max-age=31536000; includeSubDomains; preload);申请自动化证书(Let's Encrypt / ACME 协议)确保证书自动续期。
📄 HSTS 响应头配置
// Nginx HSTS 配置
add_header Strict-Transport-Security
  "max-age=31536000; includeSubDomains; preload" always;

// Spring Boot 配置
server.ssl.enabled=true
server.ssl.protocol=TLS
# TLS 1.3 需 JDK 11+
server.ssl.enabled-protocols=TLSv1.3
🌍

CORS 跨域配置

Medium

CORS(跨域资源共享)控制浏览器跨域请求的权限。配置不当会导致敏感数据被恶意站点窃取,或过度宽松的跨域策略暴露 API。

🛡️ 防御策略
精确定义允许的 Origin 白名单(勿用 *);限制允许的 HTTP 方法和 Headers;根据请求类型区分简单请求和预检请求;生产环境关闭 credentials: true 除非必要;对敏感接口实施额外的 CSRF 保护。
📄 Spring Boot CORS 配置
@Configuration
public class WebConfig implements WebMvcConfigurer {
  @Override
  public void addCorsMappings(
      CorsRegistry registry) {
    registry.addMapping("/api/**")
      .allowedOrigins("https://trusted.com")
      .allowedMethods("GET", "POST");
  }
}
📜

CSP 内容安全策略

Medium

CSP 通过 HTTP 头或 meta 标签定义可信资源来源,浏览器拒绝加载非白名单资源。有效防御 XSS、数据注入、恶意资源加载等攻击。

🛡️ 防御策略
限制 script-src 仅允许可信源(避免 'unsafe-inline');使用 nonce 或 hash 验证内联脚本;配置 report-uri/report-to 收集违规报告;逐步实施策略(先 Content-Security-Policy-Report-Only);限制 object-src, frame-src 等。
📄 CSP 响应头示例
Content-Security-Policy:
  default-src 'self';
  script-src 'self' 'nonce-abc123'
    https://cdn.trusted.com;
  style-src 'self'
    'unsafe-inline';
  img-src 'self' data: https:;
  report-uri /csp-report;
👆

点击劫持

Medium

攻击者使用透明 iframe 覆盖在恶意页面之上,诱骗用户点击看不见的目标页面按钮(点赞、转账、授权等)。用户感知不到被攻击,但操作已执行。

🛡️ 防御策略
设置 X-Frame-Options: DENY 或 SAMEORIGIN 禁止/限制 iframe 加载;在 CSP 中使用 frame-ancestors 指令精确控制允许嵌套的源;使用 JavaScript 反嵌套检测(frame busting)。
📄 点击劫持防御配置
// Nginx 配置
add_header X-Frame-Options "SAMEORIGIN" always;

// Spring Security 配置
http.headers(headers -> headers
  .frameOptions(frame -> frame.sameOrigin())
  .contentSecurityPolicy(csp -> csp
    .policyDirectives(
      "frame-ancestors 'self';"))
);

// JavaScript 反嵌套
if (top !== self) top.location = self.location;
📋

安全日志与审计

Info

全面记录用户操作和系统事件,用于事后追溯、攻击分析和合规审计。包括登录日志、操作日志、异常事件、权限变更等关键信息。

🛡️ 防御策略
记录关键事件(登录成功/失败、权限变更、敏感操作);日志不可篡改(写前追加、独立存储);使用 AOP 统一记录操作日志;配置日志轮转防止磁盘写满;敏感信息脱敏(密码、Token 不记录明文);定期审计分析。
📄 AOP 操作日志注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuditLog {
  String action();
  String module() default "";
}

// 切面中:记录操作人、IP、参数等
@Around("@annotation(auditLog)")
public void logAudit(ProceedingJoinPoint pjp,
    AuditLog auditLog) {
  // 将日志写入独立审计表
  log.info("[AUDIT] action={}, user={}",
    auditLog.action(), currentUser);
}
🔍

依赖漏洞扫描

Info

现代项目依赖大量第三方库,开源组件中可能隐藏已知漏洞(CVE)。定期扫描依赖可以及时发现并修复安全风险,是 DevSecOps 的关键环节。

🛡️ 防御策略
集成 OWASP Dependency-Check 到 Maven/Gradle 构建流程;前端项目使用 npm audit / yarn audit;依赖更新纳入 CI/CD 门禁;使用 Dependabot/Renovate 自动创建修复 PR;维护 SBOM(软件物料清单)。
📄 Maven OWASP 依赖检查
<!-- pom.xml 插件配置 -->
<plugin>
  <groupId>org.owasp</groupId>
  <artifactId>dependency-check-maven</artifactId>
  <version>10.0.4</version>
  <configuration>
    <failBuildOnCVSS>7</failBuildOnCVSS>
  </configuration>
</plugin>

# 运行检查
mvn org.owasp:dependency-check-maven:check

# npm 安全审计
npm audit --audit-level=high
3 严重等级
4 高危等级
3 中危等级
2 信息等级
12 总安全大类

安全开发最佳实践

01

纵深防御 (Defense in Depth)

不要依赖单一安全机制。网络层、应用层、数据层、人管理层各层都部署防护,即使一层被突破,其他层依然提供保护。

02

最小权限原则

每个用户、服务、组件只授予完成其任务所需的最小权限。定期审计和回收过剩权限,默认拒绝一切非显式允许的操作。

03

安全左移 (Shift Left)

在需求、设计、编码阶段就考虑安全性,而非上线后再修补。包括威胁建模、安全代码审查、自动化安全测试等实践。

04

输入永不信任

对所有外部输入(用户、上游服务、文件、环境变量)进行验证、过滤、转义。校验类型、长度、格式、范围,拒绝一切不符合预期的输入。

05

安全默认配置

框架和组件的默认配置应以安全为导向:默认开启加密、认证、CSRF 保护等。https:// 优先于 http://,白名单优于黑名单。

06

持续监控与响应

建立实时安全监控、异常检测和事件响应机制。结合 SIEM 和 SOAR 自动化告警处置,缩短从发现到修复的平均时间 (MTTR)。

安全不是终点,而是持续的过程

随时关注 OWASP Top 10、CVE 公告和安全社区动态,让安全意识融入日常开发的每一个环节。

查看 OWASP Top 10

上线前必须过一遍的安全清单

OWASP Top 10 映射

A01 访问控制、A02 加密失败、A03 注入、A05 安全配置错误、A07 认证失败、A08 软件完整性。每次上线至少映射到责任人。

安全响应头

CSP、HSTS、X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy 需按场景配置并验证。

认证加固

密码哈希、登录限流、Refresh Token 轮换、JWT 黑名单/版本号、Session ID 登录后重置。

文件上传

检查扩展名、MIME、魔数、大小、随机文件名、隔离存储、病毒扫描和下载鉴权。

# Nginx 安全头
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
// Spring Boot 登录限流思路
if (bucket.tryConsume(1)) {
  authService.login(username, password);
} else {
  throw new TooManyRequestsException("登录过于频繁");
}

发布前 Checklist

  • 所有管理接口均有鉴权和审计日志。
  • Cookie 设置 HttpOnly、Secure、SameSite。
  • 错误响应不暴露堆栈、SQL、内网 IP。
  • 依赖扫描无高危漏洞,镜像基础层已更新。
  • 上传文件不和应用代码同目录,不允许直接执行。
  • 接口限流、验证码、风控规则已覆盖暴力尝试。

上线后仍要持续治理

密钥管理

密钥不进 Git;使用环境变量/密钥管理服务;定期轮换并记录使用方。

SAST / DAST

合并前做静态扫描,上线前做动态扫描,误报要沉淀规则而不是关闭扫描。

应急响应

明确漏洞分级、负责人、止血动作、复盘模板和公告流程。

备份安全

备份同样需要加密、权限控制和恢复演练,否则只是另一个数据泄露入口。