LESSON 7.2 / PRODUCTION

Web 安全与秘密管理

安全工作先减少暴露面,再保护秘密和输入边界。目标是让常见错误更难发生,并在凭据泄露时能迅速撤销。

预计阅读约 25 到 40 分钟
完成结果完成一次任务应用安全清单,清除源码中的秘密,并验证输入、依赖和生产配置边界。
本课目标
  • 完成一次任务应用安全清单,清除源码中的秘密,并验证输入、依赖和生产配置边界。
  • 注入、XSS、CSRF、文件上传与路径风险
  • 实现Web 安全与秘密管理后,应当完成一次任务应用安全清单,清除源码中的秘密,并验证输入、依赖和生产配置边界,并保留权限响应、测试报告、证书状态、告警和恢复记录作为可重复检查的依据。
开始之前
  • 完成 7.1「登录、会话与权限」
01

FOUNDATION

必须理解

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

本课依次讲清注入、XSS、CSRF、文件上传与路径风险、密钥、环境变量、日志脱敏和轮换和依赖漏洞、更新策略和最小暴露面,最后通过“使用 OWASP Top 10 对照表记录已处理、待处理和不适用”检查学习结果。

先建立整体直觉

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

贯穿本课的实际场景

任务应用校验标题、自动转义页面输出、使用参数化查询、把数据库 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 如何参与

在Web 安全与秘密管理这一课,AI 负责根据真实材料解释注入、XSS、CSRF、文件上传与路径风险并指出遗漏,学习者负责控制范围、执行修改和核对权限响应、测试报告、证书状态、告警和恢复记录。

推荐协作顺序

  1. 1

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

  2. 2

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

  3. 3

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

可直接使用的 Prompt
请根据脱敏后的文件树、配置名、依赖清单和接口行为做安全审查。禁止索取秘密、私钥、生产数据或完整日志。按风险、证据、最小修复和复验步骤输出,不声称绝对安全。
应该得到什么

风险与实际数据流对应,并按影响和可利用性排序;建议包含验证方法而不是泛泛而谈;Web 安全与秘密管理的人工验收必须回到真实页面、请求、终端、测试或数据结果,不能用 AI 的文字说明代替。

人工检查清单

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

COMMON TRAPS

常见误区

下面三类问题会让任务看似完成,却经不起刷新、错误输入或真实环境检查。先看现象,再找原因和修正方法。

误区 1

把密钥删掉就算处理完

你会看到
历史中仍有密钥且原凭据继续有效
为什么发生
删除当前文件不会清除 Git 历史,也不会让已经泄露的密钥自动失效。
怎样纠正
立即撤销轮换并检查历史影响
误区 2

关闭防护方便排错

你会看到
临时开放变成长期暴露
为什么发生
关闭边界会改变真实运行条件,并可能把临时暴露遗留到生产环境。
怎样纠正
保留边界并用日志定位
误区 3

承诺系统绝对安全

你会看到
没有范围和证据的结论误导决策
为什么发生
安全结论依赖威胁范围和检查证据,任何测试都无法覆盖所有未来风险。
怎样纠正
记录已检查范围与剩余风险
04

HANDS-ON

动手任务

完成一次任务应用安全清单,清除源码中的秘密,并验证输入、依赖和生产配置边界。

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

跟着做

  1. 01

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

  2. 02

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

  3. 03

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

  4. 04

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

  5. 05

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

完成标志

完成一次任务应用安全清单,清除源码中的秘密,并验证输入、依赖和生产配置边界。

加餐挑战

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

离开本课前,自问四件事

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

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