Web 安全与秘密管理
安全工作先减少暴露面,再保护秘密和输入边界。目标是让常见错误更难发生,并在凭据泄露时能迅速撤销。
- 完成一次任务应用安全清单,清除源码中的秘密,并验证输入、依赖和生产配置边界。
- 注入、XSS、CSRF、文件上传与路径风险
- 实现Web 安全与秘密管理后,应当完成一次任务应用安全清单,清除源码中的秘密,并验证输入、依赖和生产配置边界,并保留权限响应、测试报告、证书状态、告警和恢复记录作为可重复检查的依据。
- 完成 7.1「登录、会话与权限」
FOUNDATION
必须理解
Web 安全不是上线前加一个开关,而是在输入、输出、身份、秘密和依赖中持续缩小攻击面。AI 能列检查项,却不能替你承担泄露与权限错误的后果。
本课依次讲清注入、XSS、CSRF、文件上传与路径风险、密钥、环境变量、日志脱敏和轮换和依赖漏洞、更新策略和最小暴露面,最后通过“使用 OWASP Top 10 对照表记录已处理、待处理和不适用”检查学习结果。
安全像宿舍管理:门锁、访客登记、贵重物品保管、消防和巡查各防一种风险。只有一把更粗的锁不能解决全部问题。
任务应用校验标题、自动转义页面输出、使用参数化查询、把数据库 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 如何参与
在Web 安全与秘密管理这一课,AI 负责根据真实材料解释注入、XSS、CSRF、文件上传与路径风险并指出遗漏,学习者负责控制范围、执行修改和核对权限响应、测试报告、证书状态、告警和恢复记录。
推荐协作顺序
- 1
把实际数据流和入口给 AI,让它只针对这几个流程做威胁建模。
- 2
让每条风险同时带验证方法和最小修复,不收泛泛清单。
- 3
涉及秘密、权限和依赖版本时回到官方安全指南核对。
请根据脱敏后的文件树、配置名、依赖清单和接口行为做安全审查。禁止索取秘密、私钥、生产数据或完整日志。按风险、证据、最小修复和复验步骤输出,不声称绝对安全。
风险与实际数据流对应,并按影响和可利用性排序;建议包含验证方法而不是泛泛而谈;Web 安全与秘密管理的人工验收必须回到真实页面、请求、终端、测试或数据结果,不能用 AI 的文字说明代替。
人工检查清单
- 确认 AI 没建议关闭安全功能、打印秘密、使用弱哈希或用前端校验代替服务端保护。
- 让 AI 为每个输入标出解释上下文、信任边界、可能攻击与具体防线。
- 通过无害测试载荷、越权请求和秘密扫描验证保护真实生效,不接受“已经安全”的文字结论。
COMMON TRAPS
常见误区
下面三类问题会让任务看似完成,却经不起刷新、错误输入或真实环境检查。先看现象,再找原因和修正方法。
把密钥删掉就算处理完
- 你会看到
- 历史中仍有密钥且原凭据继续有效
- 为什么发生
- 删除当前文件不会清除 Git 历史,也不会让已经泄露的密钥自动失效。
- 怎样纠正
- 立即撤销轮换并检查历史影响
关闭防护方便排错
- 你会看到
- 临时开放变成长期暴露
- 为什么发生
- 关闭边界会改变真实运行条件,并可能把临时暴露遗留到生产环境。
- 怎样纠正
- 保留边界并用日志定位
承诺系统绝对安全
- 你会看到
- 没有范围和证据的结论误导决策
- 为什么发生
- 安全结论依赖威胁范围和检查证据,任何测试都无法覆盖所有未来风险。
- 怎样纠正
- 记录已检查范围与剩余风险
HANDS-ON
动手任务
完成一次任务应用安全清单,清除源码中的秘密,并验证输入、依赖和生产配置边界。
- 完成 7.1「登录、会话与权限」
跟着做
- 01
画出浏览器、Next.js、数据库与第三方认证边界。
- 02
列出每层最重要的资产和不可信输入。
- 03
检查 .env、仓库历史、日志和客户端包是否暴露秘密。
- 04
验证服务端校验、参数化数据访问与输出转义。
- 05
使用 OWASP Top 10 对照表记录已处理、待处理和不适用。
完成一次任务应用安全清单,清除源码中的秘密,并验证输入、依赖和生产配置边界。
为数据库账户设计最小权限,并说明开发、预览和生产为何不应共享同一凭证。
离开本课前,自问四件事
- SQL 注入、XSS 和 CSRF 分别利用哪个信任错误?
- 为什么参数化查询不能解决所有输出安全问题?
- 秘密泄露后为什么第一步是轮换而不是删除文件?
- 最小暴露面可以从入口、权限和依赖哪些方面落实?
确认完成后,会同步更新学习中心的课程学习进度。