1. 安全基础概念:全栈安全、常见攻击模型与SDL

大家好,我是这门课的主讲。今天咱们聊聊安全基础。说实话,很多开发者觉得安全是运维的事,或者等产品上线再说。我见过太多项目,功能做得花里胡哨,结果上线第一天就被拖库了。嗯,咱们得从根上把安全思维建立起来。

1.1 什么是全栈安全?

全栈安全,说白了就是「从浏览器到数据库,每一层都不能有短板」。你想想看,前端做了加密,后端没做校验,等于白干。后端做了防注入,但服务器没打补丁,照样被黑。

我个人习惯把全栈安全分成三层:

  • 前端安全:XSS、CSRF、点击劫持、敏感信息泄露
  • 后端安全:SQL注入、认证授权漏洞、文件上传漏洞
  • 基础设施安全:HTTPS配置、服务器加固、日志审计

我在项目中遇到过最典型的案例:前端用HTTPS,但后端API接口没做鉴权,结果爬虫直接遍历用户ID,把整个用户表扒了个干净。这就是典型的「全栈不闭环」。

核心观点:安全不是某个人的事,是每个开发者的责任。你写的每一行代码,都可能成为攻击者的突破口。

1.2 常见Web攻击模型

STRIDE模型

STRIDE是微软提出的威胁建模框架。我刚开始学安全时觉得这东西太理论,后来做渗透测试才发现,它其实是个很好的「检查清单」。

威胁类型 英文 举例
假冒身份 Spoofing 伪造Cookie、盗用Token
篡改数据 Tampering 修改请求参数、篡改数据库
抵赖行为 Repudiation 用户否认操作、缺少日志
信息泄露 Information Disclosure 返回敏感字段、报错信息过多
拒绝服务 Denial of Service CC攻击、慢速攻击
权限提升 Elevation of Privilege 越权访问、水平越权

为什么会这样?因为很多开发者只关注功能实现,根本没想过「如果有人恶意使用这个功能会怎样」。我曾经帮一个电商平台做审计,发现用户可以直接修改订单金额参数——这就是典型的Tampering威胁。

OWASP Top 10

OWASP Top 10是Web安全界的「年度报告」。每三年更新一次,2021年的版本我建议大家都去官网看看。这里我挑几个重点说说:

  1. 失效的访问控制:最常见的问题。比如用户A能看用户B的订单。
  2. 加密失败:用了弱加密算法,或者密钥硬编码在代码里。
  3. 注入:SQL注入、命令注入、LDAP注入。老问题但依然普遍。
  4. 不安全的设计:架构层面就有问题,比如没有限流、没有熔断。
  5. 安全配置错误:默认密码、调试模式未关闭、CORS配置太宽松。

避坑指南:我曾经接手过一个项目,所有API都返回了完整的堆栈信息。攻击者看到「com.mysql.jdbc.exceptions...」就知道后端用的是MySQL。嗯,这就是典型的信息泄露。

1.3 安全开发生命周期(SDL)

SDL不是某个工具,而是一套流程。说白了,就是把安全「嵌入」到开发的每个阶段。我见过很多团队,开发时不管安全,上线前找安全团队扫一遍,发现问题再改——这叫「事后补救」,成本高、效果差。

我个人习惯把SDL分成五个阶段:

  • 需求阶段:做威胁建模,识别潜在风险。比如「用户登录」这个功能,要考虑暴力破解、会话劫持。
  • 设计阶段:确定安全架构。比如密码怎么存(必须加盐哈希)、Token怎么生成。
  • 开发阶段:写代码时遵循安全编码规范。比如使用参数化查询防SQL注入。
  • 测试阶段:做安全测试,包括静态扫描、动态扫描、手动渗透。
  • 运维阶段:持续监控、日志审计、应急响应。

注意:SDL不是一次性的。每次迭代都要重新走一遍。我见过一个团队,第一次做SDL很认真,后面就松懈了,结果新功能上线就出问题。

举个例子,假设你要开发一个「用户评论」功能:

  • 需求阶段:考虑XSS攻击、垃圾评论、恶意链接
  • 设计阶段:决定对评论内容做HTML转义,限制评论长度
  • 开发阶段:使用富文本编辑器时,只允许白名单标签
  • 测试阶段:用XSS payload测试,看是否被过滤
  • 运维阶段:监控异常评论,设置人工审核机制

你看,每个阶段都有对应的安全动作。这才是「全栈安全」的落地方式。

总结一下:全栈安全是全局思维,STRIDE帮你找威胁,OWASP Top 10帮你排优先级,SDL帮你把安全融入流程。这三者缺一不可。

下一章咱们聊聊「HTTPS与TLS协议」,这是全栈安全的基础设施。到时候我会分享一个我踩过的坑——证书配置错误导致线上服务不可用。嗯,那真是血的教训。