安全

Web 应用安全基础:从输入到会话

2026-08-12 #Web安全#OWASP#后端

建立输入验证、输出编码、会话保护与最小权限的基础防线。

核心思路

服务端验证所有外部输入,按输出上下文编码,数据库使用参数化查询。Cookie 启用 HttpOnly、Secure 和合理的 SameSite。

落地步骤

敏感操作需要重新认证或二次确认。依赖扫描、密钥轮换和安全日志应进入日常工程流程。

验证清单

实施后不要只确认“能运行”,还应检查错误率、延迟、资源占用和异常路径。把验证命令、预期结果和回滚方式写进变更记录,后续维护会轻松很多。

小结

好的工程实践不是堆叠工具,而是用清晰边界、可观察结果和可逆变更降低长期成本。先解决最重要的问题,再逐步自动化。

可执行实践

服务端对所有输入做允许式验证,SQL 使用参数化查询,输出按 HTML、URL、JavaScript 等上下文编码。会话 Cookie 启用 HttpOnly、Secure 和合理 SameSite。

验证与退出条件

用权限矩阵测试水平和垂直越权,敏感动作重新认证并记录审计日志。依赖扫描不能替代威胁建模和业务授权测试。

实践场景

以“保护一个带登录与写接口的 Web 应用”为例。实施前先保存当前版本、配置和关键指标基线,写明成功条件与停止条件;涉及生产数据或外部写入时,先在隔离环境验证。

分步实施

身份认证后仍逐资源鉴权;Cookie 设置 Secure、HttpOnly 与合适 SameSite,状态变更防 CSRF,输出按上下文编码。每完成一步都记录可观察结果,不把命令返回零等同于业务正确。

故障演练

尝试水平越权、存储型 XSS、跨站请求、文件路径穿越和暴力登录,确认服务端拒绝且日志不泄密。演练应使用可清理的测试数据,并验证告警、日志和恢复路径,而不只是确认系统最终又能访问。

观测与回滚

观察鉴权拒绝、异常登录和安全头;修复发布失败时回退应用但保留临时访问限制。变更单中应写清负责人、观察窗口、阈值和回滚触发器,避免故障发生后再临时争论。

完成后把使用的版本、关键命令、观测窗口和结果写入变更记录。没有验证证据的“已完成”不能作为上线结论。

第二轮实践复核

可复用交付物: 威胁模型、滥用用例和安全响应头快照。复用时先固定软件版本、依赖锁文件、测试数据规模和运行环境;文章中的命令包含占位符,必须替换成自己的非生产目标后再执行。

最低验证: 使用测试账号验证水平越权、CSRF、XSS 与限流,不对生产做未授权扫描

执行记录要保存命令、退出码、关键输出、观察窗口和回滚结果。若验证会产生写入,先使用隔离环境或 dry-run;任何失败都不能通过扩大权限、关闭校验或跳过测试来“解决”。

完整实战:评论发布链路的威胁建模

假设用户可以编辑 Markdown 评论,服务端渲染后展示给其他人。先画清数据流:浏览器提交原文,API 完成鉴权和限流,数据库保存,渲染器转换 HTML,页面再输出。每跨过一个信任边界都重新验证,不能因为“前端已经过滤”就相信服务端收到的数据。

输入、存储与输出编码是三件事

  • 输入校验负责长度、类型、允许字符和业务约束,异常输入应尽早拒绝。
  • 存储层使用参数化查询,数据库账号只拥有当前服务所需权限。
  • 输出按上下文编码:HTML 文本、HTML 属性、URL、JavaScript 字符串不是同一种上下文。
  • 允许富文本时使用成熟 sanitizer 的白名单策略;不要用正则表达式清理 HTML。
1
2
3
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-<random>'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin

CSP 是输出编码与依赖治理后的纵深防御。nonce 必须按响应随机生成,不能写成固定字符串;上线前先用 Report-Only 收集违规,确认内联脚本和第三方来源,再逐步收紧。

会话与写操作

Cookie 会话至少根据部署条件设置 Secure、HttpOnly 和合适的 SameSite;登录、修改邮箱等敏感操作重新验证身份。基于 Cookie 的写接口仍需 CSRF 防护,不能把 CORS 当作 CSRF 方案。对象接口每次按当前用户检查对象级权限,避免只判断“已经登录”。

攻击用例 测试输入/动作 通过条件
存储型 XSS 评论中加入事件属性、危险 URL 页面显示安全文本或清理后的允许标签
SQL 注入 搜索条件加入引号与运算片段 查询按普通数据处理,无错误细节泄漏
越权读取 用户 A 请求用户 B 的评论草稿 返回拒绝且产生审计事件
CSRF 从第三方站点提交删除请求 请求被 token/origin 校验拒绝
暴力尝试 短时重复登录 分层限速,不泄漏账号是否存在

上线前证据与应急

依赖扫描、静态规则和动态扫描只能覆盖一部分风险。关键业务还需人工检查信任边界、权限矩阵、密钥管理和日志脱敏。日志不能保存密码、完整令牌、Cookie 或评论中的敏感原文。

灰度观察认证失败率、权限拒绝、CSP 报告、异常输入分布和 5xx。发现利用迹象时先隔离入口、吊销可能泄露的凭据并保全日志,再修复和轮换;不要为了恢复可用性临时关闭鉴权或放宽全站 CSP。

一手资料

资料与版本边界复核日期:2026-08-22。工具行为可能演进,实施前以锁定版本对应的官方文档为准。

评论
分享

评论