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 = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
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 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 ZAP | Web 漏洞扫描 |
| Burp Suite | Web 渗透测试 |
| sqlmap | SQL 注入检测 |
| nmap | 端口扫描 |
| nikto | Web 服务器扫描 |