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)是模拟真实攻击者的授权安全评估。理解渗透测试的思路,有助于开发者站在攻击者视角审视自己的代码。
信息收集(Reconnaissance)
OSINT 收集目标信息:子域名枚举(amass/subfinder)、端口扫描(nmap)、技术栈识别(Wappalyzer)、公开源码/历史版本查找、社工信息(LinkedIn/GitHub)。
漏洞发现(Scanning)
自动化扫描(Burp Suite Scanner/OWASP ZAP)+ 手动分析:检查每个输入点(表单、API 参数、Header、Cookie),尝试注入、越权、信息泄露等漏洞。
漏洞利用(Exploitation)
验证发现的漏洞是否真实可利用(PoC)。记录利用步骤、影响范围、触发条件。不追求最大破坏,而是证明漏洞存在并评估危害。
撰写报告(Reporting)
清晰记录每个漏洞:漏洞描述、CVSS 评分、复现步骤、截图证据、影响分析、修复建议。好的报告让开发团队能够快速理解和修复。
DVWA(Damn Vulnerable Web App)和 WebGoat(OWASP 出品)是专门设计有各种已知漏洞的练习环境,可以安全地学习和实践渗透测试技术。HackTheBox 和 TryHackMe 提供在线渗透测试练习靶场。永远只在你有明确授权的系统上进行安全测试。
威胁建模: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 年收入可达数十万美元)。
安全编码 Checklist
以下是每个开发者在日常编码中应该检查的安全要点,建议将其纳入 Code Review 标准和 PR 模板中:
输入验证
所有外部输入(表单、URL 参数、Header、文件)都经过类型、长度、格式验证;使用白名单而非黑名单;文件上传验证类型、大小、内容(不只检查扩展名)。
输出编码
输出到 HTML 进行 HTML 实体编码;输出到 JavaScript 上下文进行 JS 编码;URL 参数进行 URL 编码;使用框架的自动转义功能,避免 innerHTML/dangerouslySetInnerHTML。
数据库安全
100% 使用参数化查询,无例外;ORM 查询优先;禁止 raw/execute 直接传入字符串;数据库账号最小权限;不在错误响应中暴露数据库信息。
认证与会话
密码用 bcrypt/Argon2 哈希;登录接口限速(5次/分钟);统一错误消息防枚举;登录后重生成 Session ID;Session Cookie 设 HttpOnly/Secure/SameSite;敏感操作要求重新认证/MFA。
访问控制
每个 API 端点都有鉴权;资源访问验证归属(防 IDOR);权限从服务端会话获取,不信任客户端参数;默认拒绝,显式授权;管理接口与用户接口分离。
密钥与配置
所有 Secret 通过环境变量/Vault 注入,不硬编码;定期轮换 Secret(尤其是发生人员变动时);.env 加入 .gitignore;开启 GitHub Secret Scanning;最小权限原则配置云 IAM。
依赖管理
CI 中运行依赖扫描;提交 Lock 文件;定期更新依赖(Dependabot);使用最小基础镜像;Docker 镜像扫描;Review 新增依赖的安全性(不是越多越好)。
日志与监控
记录所有认证事件(成功/失败)、权限拒绝;日志中不记录密码、Token、信用卡号;设置异常登录告警;保留日志至少 90 天;日志集中存储防篡改。
推荐学习资源
- 第一步:完整学习 PortSwigger Web Security Academy(免费,系统完整)
- 第二步:在 DVWA/WebGoat 实践本教程中学到的漏洞类型
- 第三步:对自己负责的项目进行安全代码审查(对照 Checklist)
- 第四步:参与 Bug Bounty(从小范围、低复杂度的目标开始)
- 持续:关注安全新闻(Twitter/X 上的安全研究员)、订阅 CISA 漏洞预警
恭喜你完成了 Web 安全与 OWASP Top 10 完整课程!安全不是一次性的事情,而是一种开发习惯和工程文化。本课程的核心要义:以攻击者的思维理解漏洞,以防御者的方式编写代码。理解了 SQL 注入、XSS、CSRF、IDOR 的根本原因,就能在编写每一行代码时自然地考虑安全性。将安全 Checklist 融入日常 Code Review,将安全扫描集成到 CI/CD,建立安全开发文化——这才是最强的安全防御。