LESSON 7.2 / PRODUCTION

Web 安全与秘密管理

安全不是上线后的附加项,而是每个输入、输出、权限和依赖决策中的约束。

预计阅读15–20 分钟
完成结果知道哪些数据和操作绝不能只靠用户自觉。
本课目标
  • 知道哪些数据和操作绝不能只靠用户自觉。
  • 注入、XSS、CSRF、文件上传与路径风险
  • 检查项目中所有输入、密钥、管理入口和外部请求,完成一张威胁清单。
开始之前
  • 完成 7.1「登录、会话与权限」
01

FOUNDATION

必须理解

安全不是上线后的附加项,而是每个输入、输出、权限和依赖决策中的约束。

Web 安全不是上线前加一个开关,而是在输入、输出、身份、秘密和依赖中持续缩小攻击面。AI 能列检查项,却不能替你承担泄露与权限错误的后果。

先建立整体直觉

安全像宿舍管理:门锁、访客登记、贵重物品保管、消防和巡查各防一种风险。只有一把更粗的锁不能解决全部问题。

贯穿本课的实际场景

任务应用校验标题、自动转义页面输出、使用参数化查询、把数据库 URL 留在服务端、限制登录尝试并定期更新依赖。

概念 1

注入、XSS、CSRF、文件上传与路径风险

先用白话理解

XSS 会让不可信内容变成浏览器里的脚本,SQL 注入则会把用户输入变成查询的一部分。React 的默认转义和 ORM 的参数化能帮忙,但危险 HTML 和原始 SQL 仍然要小心。

基础概念

注入是把不可信输入解释成命令;XSS(Cross-Site Scripting,跨站脚本)让内容成为浏览器脚本;CSRF(Cross-Site Request Forgery,跨站请求伪造)借用已登录浏览器发出非用户本意的请求。

进一步理解

SQL 使用参数化查询把值与语句分开,页面输出默认转义把文本与 HTML 分开。确需富文本时使用成熟净化规则,而不是简单删除几个字符。

CSRF 防护依赖 SameSite Cookie、来源检查或令牌,并应让修改操作使用正确 HTTP 方法。每种攻击利用不同信任边界。

放进实际场景

任务标题 `<script>` 应作为文字显示而不执行;删除任务接口验证请求来源与会话,SQL 条件通过参数绑定。

容易混淆的地方

输入校验不能替代输出编码,也不能用防 SQL 注入的方法防 XSS。安全措施必须放在数据被解释的具体上下文。

这一小节记住:先识别输入会被当成 SQL、HTML、路径还是请求,再用对应边界保护。

概念 2

密钥、环境变量、日志脱敏和轮换

先用白话理解

CSRF 会借用用户已经登录的浏览器,偷偷发出用户本人并不想做的请求。SameSite Cookie、来源检查和 CSRF Token 都是在堵这条路。

基础概念

秘密包括密码、API Key、数据库凭证和私钥。环境变量是一种注入配置的方法,日志脱敏避免秘密被二次复制,轮换是在泄露或到期时替换凭证并撤销旧值。

进一步理解

秘密只给需要它的服务端环境,权限按用途最小化。仓库保留变量名示例,不保留真实值;日志、错误、监控和构建输出同样不能打印秘密。

泄露后删除文件不够,因为 Git 历史、缓存和日志可能已有副本。应先撤销或轮换,再调查范围并清理历史。

放进实际场景

第三方 API Key 存在托管平台的服务端秘密中;日志只记录请求 ID 和服务名称,不打印认证头。

容易混淆的地方

环境变量不是加密保险箱。只要代码把值返回前端、写入日志或发送给无关外部服务,秘密仍然会离开可信边界。

这一小节记住:秘密要限制存放、使用和可见范围,并具备快速轮换路径。

概念 3

依赖漏洞、更新策略和最小暴露面

先用白话理解

密码、API Key、数据库地址和私钥都属于秘密。它们应该待在服务端环境里,并且能随时轮换;一旦提交过 Git,后来删掉文件也不代表风险消失。

基础概念

最小暴露面是减少可访问入口、权限和依赖;依赖更新策略则持续评估已知漏洞、兼容风险与修复优先级。

进一步理解

关闭调试路由、限制上传类型与大小、数据库不开放公网、服务账户只获必要权限,都能减少攻击机会。

漏洞扫描提供线索,不等于所有更新都应立即无测试上线。根据是否实际使用、可被利用程度和业务影响排序,在独立变更中升级并验证。

放进实际场景

生产环境关闭测试管理接口,上传文件重命名并存对象存储;每周检查依赖警报,高危且可利用问题优先修复。

容易混淆的地方

网站规模小不代表没人攻击,自动扫描不关心用户数量;反过来,依赖版本最新也不代表配置和业务授权安全。

这一小节记住:减少不必要能力,及时处理真实风险,让每层只暴露完成任务所需部分。

02

AI COLLABORATION

AI 如何参与

要求 AI 在实现功能时列出威胁、信任边界和失败方式,不能只生成“能跑”的代码。

推荐协作顺序

  1. 1

    把实际数据流和入口给 AI,让它只针对这几个流程做威胁建模。

  2. 2

    让每条风险同时带验证方法和最小修复,不收泛泛清单。

  3. 3

    涉及秘密、权限和依赖版本时回到官方安全指南核对。

可直接使用的 Prompt
请对任务应用做威胁建模,范围只包含登录、创建任务、显示任务、删除任务。按资产、攻击者、入口、可能滥用、现有防线、验证方法列出风险。优先参考 OWASP,不要给攻击载荷,只给防御和安全测试。
应该得到什么

风险与实际数据流对应,并按影响和可利用性排序;建议包含验证方法而不是泛泛而谈。

人工检查清单

  • 确认 AI 没建议关闭安全功能、打印秘密、使用弱哈希或用前端校验代替服务端保护。
  • 让 AI 为每个输入标出解释上下文、信任边界、可能攻击与具体防线。
  • 通过无害测试载荷、越权请求和秘密扫描验证保护真实生效,不接受“已经安全”的文字结论。
03

COMMON TRAPS

常见误区

错误不是需要隐藏的失败,而是帮助你看清系统边界的证据。下面三类问题在 AI 辅助学习中最常出现。

误区 1

把安全留到上线前一天

你会看到
功能已经绑死,才发现输入、权限和秘密到处混在一起。
为什么发生
通用“过滤特殊字符”不了解 SQL、HTML、路径等不同上下文,既可能漏掉攻击,也会破坏合法输入。
怎样纠正
每新增一个入口就同时确认信任边界、校验和权限。
误区 2

密钥删掉就算没泄露

你会看到
秘密曾提交到 Git,后来删除文件却没有轮换凭证。
为什么发生
秘密一旦进入历史或日志就产生多份副本,删除当前行无法撤销已经取得的访问能力。
怎样纠正
按已经泄露处理:撤销、重建、检查使用记录,再清理历史。
误区 3

依赖框架默认值解决一切

你会看到
认为 React 转义或 ORM 参数化可以覆盖所有安全场景。
为什么发生
默认密码、调试入口和全网端口会被自动扫描,小项目并不会因此隐身。
怎样纠正
明确哪些默认保护有效,危险 HTML、原始 SQL 和权限仍要单独审查。
04

HANDS-ON

动手任务

检查项目中所有输入、密钥、管理入口和外部请求,完成一张威胁清单。

准备条件
  • 完成 7.1「登录、会话与权限」

跟着做

  1. 01

    画出浏览器、Next.js、数据库与第三方认证边界。

  2. 02

    列出每层最重要的资产和不可信输入。

  3. 03

    检查 .env、仓库历史、日志和客户端包是否暴露秘密。

  4. 04

    验证服务端校验、参数化数据访问与输出转义。

  5. 05

    使用 OWASP Top 10 对照表记录已处理、待处理和不适用。

完成标志

知道哪些数据和操作绝不能只靠用户自觉。

加餐挑战

为数据库账户设计最小权限,并说明开发、预览和生产为何不应共享同一凭证。

离开本课前,自问四件事

  • SQL 注入、XSS 和 CSRF 分别利用哪个信任错误?
  • 为什么参数化查询不能解决所有输出安全问题?
  • 秘密泄露后为什么第一步是轮换而不是删除文件?
  • 最小暴露面可以从入口、权限和依赖哪些方面落实?
完成本课了吗?

确认完成后,会同步更新学习中心的课程学习进度。