Web 安全与秘密管理
安全不是上线后的附加项,而是每个输入、输出、权限和依赖决策中的约束。
- 知道哪些数据和操作绝不能只靠用户自觉。
- 注入、XSS、CSRF、文件上传与路径风险
- 检查项目中所有输入、密钥、管理入口和外部请求,完成一张威胁清单。
- 完成 7.1「登录、会话与权限」
FOUNDATION
必须理解
安全不是上线后的附加项,而是每个输入、输出、权限和依赖决策中的约束。
Web 安全不是上线前加一个开关,而是在输入、输出、身份、秘密和依赖中持续缩小攻击面。AI 能列检查项,却不能替你承担泄露与权限错误的后果。
安全像宿舍管理:门锁、访客登记、贵重物品保管、消防和巡查各防一种风险。只有一把更粗的锁不能解决全部问题。
任务应用校验标题、自动转义页面输出、使用参数化查询、把数据库 URL 留在服务端、限制登录尝试并定期更新依赖。
注入、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、路径还是请求,再用对应边界保护。
密钥、环境变量、日志脱敏和轮换
CSRF 会借用用户已经登录的浏览器,偷偷发出用户本人并不想做的请求。SameSite Cookie、来源检查和 CSRF Token 都是在堵这条路。
基础概念
秘密包括密码、API Key、数据库凭证和私钥。环境变量是一种注入配置的方法,日志脱敏避免秘密被二次复制,轮换是在泄露或到期时替换凭证并撤销旧值。
进一步理解
秘密只给需要它的服务端环境,权限按用途最小化。仓库保留变量名示例,不保留真实值;日志、错误、监控和构建输出同样不能打印秘密。
泄露后删除文件不够,因为 Git 历史、缓存和日志可能已有副本。应先撤销或轮换,再调查范围并清理历史。
第三方 API Key 存在托管平台的服务端秘密中;日志只记录请求 ID 和服务名称,不打印认证头。
环境变量不是加密保险箱。只要代码把值返回前端、写入日志或发送给无关外部服务,秘密仍然会离开可信边界。
这一小节记住:秘密要限制存放、使用和可见范围,并具备快速轮换路径。
依赖漏洞、更新策略和最小暴露面
密码、API Key、数据库地址和私钥都属于秘密。它们应该待在服务端环境里,并且能随时轮换;一旦提交过 Git,后来删掉文件也不代表风险消失。
基础概念
最小暴露面是减少可访问入口、权限和依赖;依赖更新策略则持续评估已知漏洞、兼容风险与修复优先级。
进一步理解
关闭调试路由、限制上传类型与大小、数据库不开放公网、服务账户只获必要权限,都能减少攻击机会。
漏洞扫描提供线索,不等于所有更新都应立即无测试上线。根据是否实际使用、可被利用程度和业务影响排序,在独立变更中升级并验证。
生产环境关闭测试管理接口,上传文件重命名并存对象存储;每周检查依赖警报,高危且可利用问题优先修复。
网站规模小不代表没人攻击,自动扫描不关心用户数量;反过来,依赖版本最新也不代表配置和业务授权安全。
这一小节记住:减少不必要能力,及时处理真实风险,让每层只暴露完成任务所需部分。
AI COLLABORATION
AI 如何参与
要求 AI 在实现功能时列出威胁、信任边界和失败方式,不能只生成“能跑”的代码。
推荐协作顺序
- 1
把实际数据流和入口给 AI,让它只针对这几个流程做威胁建模。
- 2
让每条风险同时带验证方法和最小修复,不收泛泛清单。
- 3
涉及秘密、权限和依赖版本时回到官方安全指南核对。
请对任务应用做威胁建模,范围只包含登录、创建任务、显示任务、删除任务。按资产、攻击者、入口、可能滥用、现有防线、验证方法列出风险。优先参考 OWASP,不要给攻击载荷,只给防御和安全测试。
风险与实际数据流对应,并按影响和可利用性排序;建议包含验证方法而不是泛泛而谈。
人工检查清单
- 确认 AI 没建议关闭安全功能、打印秘密、使用弱哈希或用前端校验代替服务端保护。
- 让 AI 为每个输入标出解释上下文、信任边界、可能攻击与具体防线。
- 通过无害测试载荷、越权请求和秘密扫描验证保护真实生效,不接受“已经安全”的文字结论。
COMMON TRAPS
常见误区
错误不是需要隐藏的失败,而是帮助你看清系统边界的证据。下面三类问题在 AI 辅助学习中最常出现。
把安全留到上线前一天
- 你会看到
- 功能已经绑死,才发现输入、权限和秘密到处混在一起。
- 为什么发生
- 通用“过滤特殊字符”不了解 SQL、HTML、路径等不同上下文,既可能漏掉攻击,也会破坏合法输入。
- 怎样纠正
- 每新增一个入口就同时确认信任边界、校验和权限。
密钥删掉就算没泄露
- 你会看到
- 秘密曾提交到 Git,后来删除文件却没有轮换凭证。
- 为什么发生
- 秘密一旦进入历史或日志就产生多份副本,删除当前行无法撤销已经取得的访问能力。
- 怎样纠正
- 按已经泄露处理:撤销、重建、检查使用记录,再清理历史。
依赖框架默认值解决一切
- 你会看到
- 认为 React 转义或 ORM 参数化可以覆盖所有安全场景。
- 为什么发生
- 默认密码、调试入口和全网端口会被自动扫描,小项目并不会因此隐身。
- 怎样纠正
- 明确哪些默认保护有效,危险 HTML、原始 SQL 和权限仍要单独审查。
HANDS-ON
动手任务
检查项目中所有输入、密钥、管理入口和外部请求,完成一张威胁清单。
- 完成 7.1「登录、会话与权限」
跟着做
- 01
画出浏览器、Next.js、数据库与第三方认证边界。
- 02
列出每层最重要的资产和不可信输入。
- 03
检查 .env、仓库历史、日志和客户端包是否暴露秘密。
- 04
验证服务端校验、参数化数据访问与输出转义。
- 05
使用 OWASP Top 10 对照表记录已处理、待处理和不适用。
知道哪些数据和操作绝不能只靠用户自觉。
为数据库账户设计最小权限,并说明开发、预览和生产为何不应共享同一凭证。
离开本课前,自问四件事
- SQL 注入、XSS 和 CSRF 分别利用哪个信任错误?
- 为什么参数化查询不能解决所有输出安全问题?
- 秘密泄露后为什么第一步是轮换而不是删除文件?
- 最小暴露面可以从入口、权限和依赖哪些方面落实?
确认完成后,会同步更新学习中心的课程学习进度。