跳到主要内容

Web 安全速查表

本页面汇总了 Web 安全开发中最常用的安全措施和最佳实践,方便快速参考。

常见漏洞防护

SQL 注入

// 参数化查询(推荐)
PreparedStatement stmt = connection.prepareStatement(
"SELECT * FROM users WHERE username = ?"
);
stmt.setString(1, username);

// 或者使用 ORM
User user = userRepository.findByUsername(username);
# Python 参数化查询
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))

XSS 防护

// HTML 编码
function escapeHtml(text) {
const map = {
'&': '&',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#039;'
};
return text.replace(/[&<>"']/g, m => map[m]);
}

// 使用安全 API
element.textContent = userInput; // 安全
element.innerHTML = userInput; // 危险

命令注入

// 不使用用户输入执行系统命令
// 使用白名单验证
if (!filename.matches("^[a-zA-Z0-9._-]+$")) {
throw new IllegalArgumentException("Invalid filename");
}

身份认证

密码存储

// BCrypt 哈希
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(12);
String hash = encoder.encode(password);

// 验证
if (encoder.matches(inputPassword, storedHash)) {
// 密码正确
}
Cookie cookie = new Cookie("SESSION_ID", sessionId);
cookie.setHttpOnly(true); // 禁止 JavaScript 访问
cookie.setSecure(true); // 仅 HTTPS
cookie.setSameSite("Strict"); // 防止 CSRF
cookie.setMaxAge(30 * 60); // 30 分钟
response.addCookie(cookie);

JWT Token

// 生成
String token = Jwts.builder()
.setSubject(userId)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();

// 验证
Claims claims = Jwts.parserBuilder()
.setSigningKey(secretKey)
.build()
.parseClaimsJws(token)
.getBody();

访问控制

Spring Security 注解

@PreAuthorize("hasRole('ADMIN')")
@PreAuthorize("hasAuthority('USER_WRITE')")
@PreAuthorize("#userId == authentication.principal.id")

资源归属检查

User currentUser = getCurrentUser();
Resource resource = getResource(id);

if (!resource.getOwnerId().equals(currentUser.getId()) &&
currentUser.getRole() != Role.ADMIN) {
throw new AccessDeniedException("无权访问");
}

安全响应头

Nginx 配置

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Content-Security-Policy "default-src 'self'" always;

Spring 配置

http.headers()
.frameOptions().deny()
.contentTypeOptions().and()
.xssProtection().and()
.httpStrictTransportSecurity()
.includeSubDomains(true)
.maxAgeInSeconds(31536000);

加密

对称加密(AES-GCM)

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, new GCMParameterSpec(128, iv));
byte[] encrypted = cipher.doFinal(plaintext);

HTTPS 强制配置

http.requiresChannel()
.antMatchers("/api/**").requiresSecure()
.anyRequest().requiresSecure();

日志记录

安全事件日志

事件日志级别
登录成功INFO
登录失败WARN
访问被拒绝WARN
权限变更INFO
敏感操作INFO
异常错误ERROR

安全配置检查清单

开发阶段

  • 使用参数化查询
  • 输出编码/转义
  • 启用安全框架
  • 实施访问控制
  • 安全存储密码

测试阶段

  • 自动化安全扫描
  • 渗透测试
  • 代码审查
  • 依赖检查

生产阶段

  • HTTPS 启用
  • HSTS 配置
  • 安全头配置
  • 日志监控
  • 定期更新

常用工具

工具用途
OWASP ZAPWeb 漏洞扫描
Burp SuiteWeb 渗透测试
sqlmapSQL 注入检测
nmap端口扫描
niktoWeb 服务器扫描

参考链接