Chapter 10

安全测试与开发文化

SAST/DAST 工具链、威胁建模 STRIDE、Bug Bounty——将安全融入开发日常

SAST:静态应用安全测试

SAST(Static Application Security Testing,静态分析)在不运行代码的情况下分析源代码,找出潜在的安全漏洞。可以集成到 IDE、Git pre-commit hook 和 CI/CD 流水线中,实现"左移安全"(在早期阶段发现漏洞,修复成本最低)。

Semgrep:现代化轻量 SAST 工具

# 安装 Semgrep
pip install semgrep
# 或 Docker:docker run --rm -v "${PWD}:/src" returntocorp/semgrep

# 使用 OWASP Top 10 规则集扫描(自动下载规则)
semgrep --config=p/owasp-top-ten .

# 使用安全规则集扫描 Python 项目
semgrep --config=p/python-security .

# 使用多个规则集
semgrep --config=p/security-audit --config=p/secrets .

# 扫描 JavaScript/TypeScript(检测 XSS、注入等)
semgrep --config=p/javascript .

# CI/CD 集成:只扫描本次 PR 变更的代码
semgrep ci  # 自动检测 Git 变更范围

自定义 Semgrep 规则

# .semgrep/custom-rules.yml
rules:
  # 检测危险的 SQL 字符串拼接
  - id: sql-injection-f-string
    pattern: f"... SQL ... {$VAR} ..."
    message: 检测到使用 f-string 拼接 SQL,可能存在 SQL 注入风险
    severity: ERROR
    languages: [python]
    fix: 使用参数化查询替代字符串拼接

  # 检测硬编码密码
  - id: hardcoded-password
    patterns:
      - pattern: password = "..."
      - pattern-not: password = ""
    message: 检测到硬编码密码,请使用环境变量
    severity: WARNING
    languages: [python]

CodeQL(GitHub Advanced Security)

# .github/workflows/codeql.yml
name: CodeQL Analysis

on:
  push:
    branches: [main]
  pull_request:
  schedule:
    - cron: '0 2 * * 1'  # 每周一凌晨 2 点

jobs:
  analyze:
    runs-on: ubuntu-latest
    permissions:
      security-events: write

    steps:
    - uses: actions/checkout@v4

    - name: 初始化 CodeQL
      uses: github/codeql-action/init@v3
      with:
        languages: python, javascript  # 支持 C++/C#/Go/Java/Kotlin/Ruby/Swift
        queries: security-and-quality  # 安全 + 质量规则

    - name: 执行 CodeQL 分析
      uses: github/codeql-action/analyze@v3
      with:
        category: /language:python

DAST:动态应用安全测试

DAST(Dynamic Application Security Testing)通过实际运行应用并发送各种测试请求来发现漏洞,类似于自动化的渗透测试。DAST 可以发现 SAST 可能遗漏的运行时漏洞(配置错误、认证问题等)。

OWASP ZAP 自动化扫描

# 基线扫描(被动扫描 + 少量主动测试,适合 CI/CD)
docker run --rm -t owasp/zap2docker-stable \
  zap-baseline.py \
  -t https://staging.example.com \
  -r zap-report.html \
  -I  # 即使发现问题也不以非零退出(可选,取决于 CI 策略)

# 完整扫描(更全面的主动测试,耗时较长)
docker run --rm -t owasp/zap2docker-stable \
  zap-full-scan.py \
  -t https://staging.example.com \
  -r zap-full-report.html

# ZAP 集成到 GitHub Actions
# GitHub Actions ZAP 集成
- name: OWASP ZAP 扫描
  uses: zaproxy/action-baseline@v0.11.0
  with:
    target: https://staging.example.com
    rules_file_name: .zap/rules.tsv  # 可配置忽略规则
    cmd_options: '-a'  # 包含 AJAX Spider(测试 SPA 应用)

渗透测试流程简介

渗透测试(Penetration Testing,Pentest)是模拟真实攻击者的授权安全评估。理解渗透测试的思路,有助于开发者站在攻击者视角审视自己的代码。

01

信息收集(Reconnaissance)

OSINT 收集目标信息:子域名枚举(amass/subfinder)、端口扫描(nmap)、技术栈识别(Wappalyzer)、公开源码/历史版本查找、社工信息(LinkedIn/GitHub)。

02

漏洞发现(Scanning)

自动化扫描(Burp Suite Scanner/OWASP ZAP)+ 手动分析:检查每个输入点(表单、API 参数、Header、Cookie),尝试注入、越权、信息泄露等漏洞。

03

漏洞利用(Exploitation)

验证发现的漏洞是否真实可利用(PoC)。记录利用步骤、影响范围、触发条件。不追求最大破坏,而是证明漏洞存在并评估危害。

04

撰写报告(Reporting)

清晰记录每个漏洞:漏洞描述、CVSS 评分、复现步骤、截图证据、影响分析、修复建议。好的报告让开发团队能够快速理解和修复。

渗透测试工具学习资源

DVWA(Damn Vulnerable Web App)和 WebGoat(OWASP 出品)是专门设计有各种已知漏洞的练习环境,可以安全地学习和实践渗透测试技术。HackTheBoxTryHackMe 提供在线渗透测试练习靶场。永远只在你有明确授权的系统上进行安全测试。

威胁建模:STRIDE

威胁建模(Threat Modeling)是在设计阶段系统性地识别安全威胁的方法。STRIDE 是 Microsoft 开发的威胁分类框架,帮助团队在编码前发现设计层面的安全问题。

字母威胁类型破坏的安全属性典型示例
S Spoofing(欺骗) 身份认证 冒充其他用户、伪造 JWT Token
T Tampering(篡改) 完整性 修改数据库记录、篡改 HTTP 请求参数
R Repudiation(抵赖) 不可否认性 无日志证明用户是否执行了操作
I Information Disclosure(信息泄露) 保密性 SQL 错误暴露表结构、IDOR 泄露他人数据
D Denial of Service(拒绝服务) 可用性 DDoS 攻击、无限速登录导致数据库过载
E Elevation of Privilege(权限提升) 授权 普通用户访问管理功能、越权读取他人数据

Bug Bounty:参与指南

Bug Bounty(漏洞赏金)计划允许安全研究人员在规定范围内测试企业系统,发现并负责任地报告漏洞以获得奖励。对开发者来说,理解 Bug Bounty 有两个价值:① 用 Bug Hunter 的视角审视自己的代码;② 作为职业发展路径(高水平的 Bug Hunter 年收入可达数十万美元)。

主要平台
HackerOne(最大,Google/微软/Shopify 等)、Bugcrowd(面向企业)、Intigriti(欧洲主流)、国内平台:漏洞盒子、SRC(各大厂商自建安全响应中心)。
Scope(测试范围)
每个项目明确定义了可以测试的目标(域名、IP、App)和禁止测试的内容(生产数据库、用户数据)。严格在 Scope 内操作,超出 Scope 可能面临法律责任。
负责任披露
发现漏洞后,给企业合理的修复时间(通常 90 天)后才公开披露。不利用漏洞访问他人数据、不破坏系统。负责任的披露是安全社区的基本道德。
入门推荐
从公开漏洞报告中学习(HackerOne 的 Hacktivity 公开已修复漏洞的报告,可以看到真实漏洞的思路和利用方式)。先在 HackTheBox/DVWA 上练习,再参与真实项目。

安全编码 Checklist

以下是每个开发者在日常编码中应该检查的安全要点,建议将其纳入 Code Review 标准和 PR 模板中:

输入

输入验证

所有外部输入(表单、URL 参数、Header、文件)都经过类型、长度、格式验证;使用白名单而非黑名单;文件上传验证类型、大小、内容(不只检查扩展名)。

输出

输出编码

输出到 HTML 进行 HTML 实体编码;输出到 JavaScript 上下文进行 JS 编码;URL 参数进行 URL 编码;使用框架的自动转义功能,避免 innerHTML/dangerouslySetInnerHTML。

SQL

数据库安全

100% 使用参数化查询,无例外;ORM 查询优先;禁止 raw/execute 直接传入字符串;数据库账号最小权限;不在错误响应中暴露数据库信息。

认证

认证与会话

密码用 bcrypt/Argon2 哈希;登录接口限速(5次/分钟);统一错误消息防枚举;登录后重生成 Session ID;Session Cookie 设 HttpOnly/Secure/SameSite;敏感操作要求重新认证/MFA。

授权

访问控制

每个 API 端点都有鉴权;资源访问验证归属(防 IDOR);权限从服务端会话获取,不信任客户端参数;默认拒绝,显式授权;管理接口与用户接口分离。

Secret

密钥与配置

所有 Secret 通过环境变量/Vault 注入,不硬编码;定期轮换 Secret(尤其是发生人员变动时);.env 加入 .gitignore;开启 GitHub Secret Scanning;最小权限原则配置云 IAM。

依赖

依赖管理

CI 中运行依赖扫描;提交 Lock 文件;定期更新依赖(Dependabot);使用最小基础镜像;Docker 镜像扫描;Review 新增依赖的安全性(不是越多越好)。

日志

日志与监控

记录所有认证事件(成功/失败)、权限拒绝;日志中不记录密码、Token、信用卡号;设置异常登录告警;保留日志至少 90 天;日志集中存储防篡改。

推荐学习资源

实践靶场
DVWA(Damn Vulnerable Web App):本地搭建的漏洞练习环境,包含 SQL 注入/XSS/CSRF/文件上传等;WebGoat(OWASP):交互式 Web 安全学习平台,边学边练;PortSwigger Web Security Academy:Burp Suite 官方免费课程,业界最佳 Web 安全学习资源。
CTF 平台
HackTheBox:真实渗透测试环境练习;TryHackMe:适合初学者的引导式靶场;CTFtime.org:CTF 赛事日历,参加国际竞赛。
权威文档
OWASP Top 10(owasp.org/Top10);OWASP ASVS(Application Security Verification Standard,应用安全验证标准);NIST 网络安全框架CWE Top 25(最危险的软件缺陷)。
书籍推荐
《The Web Application Hacker's Handbook》(Web 应用安全攻防圣经);《Real-World Bug Hunting》(Bug Bounty 实战);《The Tangled Web》(Web 安全技术深度解析)。
漏洞信息
NVD(nvd.nist.gov):官方 CVE 数据库;HackerOne Hacktivity:真实漏洞报告(修复后公开);Project Zero(googleprojectzero.blogspot.com):Google 安全团队高质量漏洞研究。
开发者学习 Web 安全的路径建议
课程总结

恭喜你完成了 Web 安全与 OWASP Top 10 完整课程!安全不是一次性的事情,而是一种开发习惯和工程文化。本课程的核心要义:以攻击者的思维理解漏洞,以防御者的方式编写代码。理解了 SQL 注入、XSS、CSRF、IDOR 的根本原因,就能在编写每一行代码时自然地考虑安全性。将安全 Checklist 融入日常 Code Review,将安全扫描集成到 CI/CD,建立安全开发文化——这才是最强的安全防御。