前置知识: 网络安全

安全开发

3 minIntermediate2026/6/14

安全开发:SDL、威胁建模、安全编码、SAST/DAST与安全测试

1. 安全开发生命周期(SDL)

1.1 SDL 阶段

阶段安全活动
需求安全需求、合规要求
设计威胁建模
实现安全编码、代码审查
测试SAST/DAST/渗透测试
发布安全评估、签名
运维漏洞响应、监控

1.2 安全左移

将安全活动前移到开发早期,降低修复成本:

修复成本:需求阶段×1<编码阶段×10<测试阶段×100<生产阶段×1000\text{修复成本}:\text{需求阶段} \times 1 < \text{编码阶段} \times 10 < \text{测试阶段} \times 100 < \text{生产阶段} \times 1000

2. 威胁建模

2.1 STRIDE 模型

威胁安全属性示例
Spoofing认证身份冒充
Tampering完整性数据篡改
Repudiation不可否认否认操作
Info Disclosure机密性信息泄露
Denial of Service可用性服务拒绝
Elevation授权权限提升

2.2 威胁建模流程

1. 绘制系统架构图
2. 识别信任边界
3. 应用STRIDE识别威胁
4. 评估风险等级
5. 制定缓解措施

3. 安全编码

3.1 输入验证

# 白名单验证
import re
if not re.match(r'^[a-zA-Z0-9_]{1,50}$', username):
    raise ValueError("Invalid username")

# 参数化查询
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

3.2 输出编码

from markupsafe import escape
html = f"<p>Hello, {escape(name)}</p>"

3.3 安全配置

# Cookie安全
app.config['SESSION_COOKIE_SECURE'] = True
app.config['SESSION_COOKIE_HTTPONLY'] = True
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'

# 安全头
@app.after_request
def set_headers(response):
    response.headers['X-Content-Type-Options'] = 'nosniff'
    response.headers['X-Frame-Options'] = 'DENY'
    response.headers['Content-Security-Policy'] = "default-src 'self'"
    return response

4. 安全测试

4.1 SAST

静态应用安全测试,扫描源代码:

工具语言
Semgrep多语言
SonarQube多语言
CodeQL多语言
BanditPython
BrakemanRuby

4.2 DAST

动态应用安全测试,测试运行中的应用:

工具特点
OWASP ZAP开源
Burp Suite专业
NiktoWeb服务器

4.3 SCA

软件成分分析,检查依赖漏洞:

工具说明
DependabotGitHub集成
Snyk商业
Trivy开源
OWASP Dependency-Check开源

5. 安全代码审查

5.1 审查清单

检查项
认证密码存储、会话管理
授权访问控制、权限检查
输入验证、过滤、编码
输出编码、CSP
加密算法选择、密钥管理
日志敏感信息脱敏
错误不暴露堆栈信息

5.2 常见安全缺陷

缺陷CWE严重度
SQL注入CWE-89
XSSCWE-79
硬编码密码CWE-259
不安全反序列化CWE-502
路径遍历CWE-22
不安全随机数CWE-330