代码安全审计
依赖扫描
常用工具
| 工具 | 语言 | 特点 |
|---|---|---|
| OWASP Dependency-Check | Java / .NET / Python | OWASP 官方,CVE 数据库 |
| Snyk | 多语言 | IDE 插件 + CI 集成 |
| GitHub Dependabot | 多语言 | GitHub 原生,自动 PR |
| Trivy | 多语言 | 轻量,支持容器镜像 |
| Renovate | 多语言 | 自动更新依赖版本 |
OWASP Dependency-Check 集成
xml
<!-- Maven 插件 -->
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>10.0.4</version>
<configuration>
<failBuildOnCVSS>7</failBuildOnCVSS> <!-- CVSS ≥ 7 构建失败 -->
<formats>
<format>HTML</format>
<format>JSON</format>
</formats>
<suppressionFiles>
<suppressionFile>owasp-suppressions.xml</suppressionFile>
</suppressionFiles>
</configuration>
</plugin>
# 执行扫描
mvn dependency-check:check漏洞管理流程
发现漏洞 → 评估影响(CVSS) → 查找修复版本
├─ 有修复 → 更新依赖 → 回归测试
└─ 无修复 → 风险评估 → 临时缓解措施
├─ WAF 规则拦截
├─ 禁用受影响功能
└─ 网络隔离SAST(静态应用安全测试)
工具对比
| 工具 | 语言 | 准确率 | 速度 |
|---|---|---|---|
| SonarQube | 30+ | 中 | 快 |
| Fortify | 25+ | 高 | 慢 |
| Checkmarx | 25+ | 高 | 中 |
| CodeQL | 多语言 | 高 | 中 |
| Semgrep | 多语言 | 中 | 快 |
SonarQube 集成
xml
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
</plugin>bash
# 执行扫描
mvn sonar:sonar \
-Dsonar.host.url=https://sonarqube.example.com \
-Dsonar.login=SONAR_TOKEN \
-Dsonar.qualitygate.wait=true
# 质量门禁规则示例
# - 没有 blocker/critical 级别漏洞
# - 安全热点全部审阅
# - 代码重复度 < 3%
# - 测试覆盖率 > 80%SAST 常见发现
| 漏洞类型 | 示例代码 | 修复建议 |
|---|---|---|
| SQL 注入 | Statement.executeQuery(sql) | 使用 PreparedStatement |
| XSS | response.write(userInput) | 输出编码 + CSP |
| 路径遍历 | new File(request.getParameter("path")) | 白名单校验 |
| 反序列化 | ObjectInputStream.readObject() | 使用安全替代方案 |
| 硬编码密钥 | String secret = "123456" | 使用 KMS / 配置中心 |
DAST(动态应用安全测试)
工具
| 工具 | 类型 | 特点 |
|---|---|---|
| OWASP ZAP | 开源 | 代理拦截 + 主动扫描 |
| Burp Suite | 商业 | 专业渗透测试 |
| Nessus | 商业 | 漏洞扫描 + 合规检查 |
| Acunetix | 商业 | 自动化 Web 漏洞扫描 |
OWASP ZAP 自动化
bash
# Docker 中运行 ZAP 扫描
docker run -v $(pwd):/zap/wrk/ \
-t ghcr.io/zaproxy/zaproxy \
zap-api-scan.py \
-t https://api.example.com/openapi.json \
-f openapi \
-r zap-report.html
# 主动扫描
docker run -t ghcr.io/zaproxy/zaproxy \
zap-full-scan.py \
-t https://staging.example.com \
-r scan-report.html安全编码规范
输入校验
java
// 1. 白名单校验
public void validateUsername(String username) {
if (!username.matches("^[a-zA-Z0-9_]{3,20}$")) {
throw new IllegalArgumentException("用户名格式非法");
}
}
// 2. 参数化查询(避免注入)
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);
// 3. 文件上传限制
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB输出编码
java
// HTML 上下文
String safe = Encode.forHtml(userInput);
// JavaScript 上下文
String safe = Encode.forJavaScript(userInput);
// URL 参数
String safe = Encode.forUriComponent(userInput);
// CSS
String safe = Encode.forCssString(userInput);安全配置
yaml
# 应用安全配置
server:
servlet:
session:
timeout: 30m # Session 超时
cookie:
http-only: true # 禁止 JS 访问
secure: true # 仅 HTTPS 传输
same-site: strict # 防 CSRF
# 响应头安全
headers:
xss-protection: 1; mode=block
content-security-policy: default-src 'self'
x-frame-options: DENY
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-originCI/CD 安全集成
流水线安全门禁
yaml
# .github/workflows/security.yml
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 依赖扫描
run: mvn dependency-check:check
- name: SAST 扫描
run: mvn sonar:sonar
- name: 密钥泄露检测
uses: trufflesecurity/trufflehog@v3
- name: Docker 镜像扫描
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:latest'
severity: 'HIGH,CRITICAL'密钥泄露检测
bash
# 使用 git secrets 防止密钥提交
git secrets --install
git secrets --add 'password\s*=\s*.+'
git secrets --add 'secret\s*=\s*.+'
git secrets --add '-----BEGIN RSA PRIVATE KEY-----'
# 扫描历史
trufflehog git --repository-path . --results=verified