跳到主要内容
约 5 分钟4 张卡

Web 应用安全

Web 应用安全控制输入的解释与跨边界访问。本文负责注入、XSS、CSRF、SSRF 与反序列化。

1. 面试核心​

先记住这几条,再读正文

2. 注入​

用户输入进入解释器语法后,会改变指令含义。SQL、Shell、模板和 LDAP 都存在此类边界。

// 风险示例:输入成为 SQL 语法的一部分。
String sql = "SELECT * FROM users WHERE name = '" + name + "'";

值参数使用参数化查询。表名和排序列由服务端白名单映射。参数绑定只处理值,动态 SQL 结构仍需约束。

执行进程时优先使用专用 API。必须启动程序时,固定可执行项并校验参数。即使绕开 Shell,危险命令选项仍需限制。

3. 输入校验​

服务端校验类型、长度、枚举和字段关系。规范化之后再执行安全判断。客户端校验用于及时反馈,服务端仍需独立检查。

输入校验与参数绑定承担不同职责。合法姓名可以含引号,参数绑定会把引号作为数据。查询权限则由资源授权决定。

4. 越权​

水平越权涉及同级用户资源,垂直越权涉及高权限动作。统一防护见 授权决策。

批量接口要逐项检查资源权限。UUID 降低枚举概率,但不提供访问权限。导出、对象链接和异步任务同样需要校验。

5. XSS 与 CSRF​

XSS 让攻击脚本在受害站点的上下文中执行。存储型、反射型与 DOM XSS 的入口各异。输出时应按 HTML、属性或 JavaScript 上下文编码。

展示纯文本可使用 textContent 等安全接口。允许富文本时使用 HTML 清理库。CSP 可缩小脚本执行范围,作为额外防护。

CSRF 利用浏览器自动附带的 Cookie 等凭据。站点应验证 CSRF token,并核对请求来源。SameSite 提供额外限制,状态变更使用非 GET 请求。

HttpOnly 阻止脚本读取 Cookie。已执行的 XSS 仍可借浏览器发送认证请求。CORS 控制跨源脚本读取响应,并非完整的 CSRF 防线。

6. SSRF​

URL 预览、Webhook 与下载接口会访问外部地址。目标若由攻击者控制,服务就会代其发起请求。敏感目标包括云元数据、回环和内网管理接口。

预登记目标可使用域名白名单。开放 URL 接口需限制协议、端口和地址范围。响应大小、读取时长与重定向次数也应设上限。

6.1 DNS 与重定向边界​

校验与连接必须使用同一个已验证地址集合。否则第二次 DNS 解析会引入检查与使用的时间差。地址校验需覆盖 IPv4、IPv6 和特殊地址。

默认关闭自动重定向最容易控制边界。若业务需要跟随,每一跳都重新验证目标。代理层也必须遵循这些规则。

出站网络策略阻断敏感网段,作为第二层控制。仅检查 URL 字符串会遗漏实际连接地址。

7. 不安全的反序列化​

对象反序列化可在构造对象图时执行类中的逻辑。攻击者控制类型后,能组合类路径中的危险调用。

跨边界数据使用明确 schema 和受限 DTO。JSON 若开放任意多态类型,也会引入同类风险。限制类型、字节数、嵌套深度和集合大小。

Java 17 可通过 ObjectInputFilter 检查对象输入。过滤规则需主动配置,并验证拒绝行为。签名只能约束来源与完整性,类型控制仍然必要。

8. 攻击链​

SSRF 可读取高权限凭据,再触发数据导出。最小权限、出站隔离与资源授权共同限制影响。凭据管理见 密钥管理。

9. 错误信息与日志​

客户端只接收错误类别和关联 ID。内部 SQL 与文件路径仅用于受控诊断。token 等凭据值应从响应和日志中移除。

日志需脱敏、限速,并清理换行等控制字符。监控按拒绝规则聚合,避免用完整 payload 作标签。

10. 安全测试​

测试覆盖跨租户 ID、批量资源和未知类型。URL 接口还需覆盖重定向、IPv6 与 DNS 变化。富文本测试同时检查渲染位置和危险 DOM 接口。

依赖扫描与静态分析提供风险线索。资源授权仍需用业务测试验证。

11. 常见问题​

11.1 ORM 的参数边界​

ORM 的参数绑定保护值参数。原生 SQL、动态片段和排序表达式仍需单独审查。

11.2 私有地址过滤的边界​

12 · 面试题卡片​

12.1 如何同时防止 SQL 注入、水平越权和 SSRF?​

出现公司:字节跳动

题型:综合题

考察重点:解释器、资源与网络边界。

相关内容:注入、越权、SSRF。

参考回答

SQL 值使用参数绑定,结构参数使用白名单。

资源服务按主体、租户、资源和动作授权。URL 接口校验实际目标,并限制出站网络。

三类控制分别保护解释器、数据和网络。测试应覆盖动态 SQL、跨租户 ID 和重定向目标。

12.2 XSS 与 CSRF 有何区别,CORS 和 HttpOnly 能防什么?​

出现公司:暂无已核验的公开来源(本站自测)

考察重点:脚本执行、凭据携带与浏览器边界。

相关内容:XSS 与 CSRF。

参考回答

XSS 在站点内执行脚本,CSRF 借自动凭据发起请求。

XSS 防护以安全输出和富文本清理为主。CSRF 防护验证 token 与请求来源。

HttpOnly 限制脚本读取 Cookie。CORS 限制跨源脚本读取响应。二者都无法覆盖所有伪造请求。

12.3 校验域名后再请求,为什么仍会发生 SSRF?​

出现公司:暂无已核验的公开来源(本站自测)

考察重点:DNS 时间差、重定向与网络控制。

相关内容:DNS 与重定向边界。

参考回答

DNS 再解析或重定向会改变实际连接目标。

校验应绑定连接使用的地址。每次跳转都重新检查,或直接禁用跳转。

IPv4、IPv6 和代理路径都要纳入校验。网络层另行阻断元数据和管理网段。

12.4 改用 JSON 后,怎样控制反序列化风险?​

出现公司:暂无已核验的公开来源(本站自测)

考察重点:动态类型、schema 与资源限制。

相关内容:不安全的反序列化。

参考回答

使用明确 DTO,并关闭任意多态类型解析。

JSON 的风险取决于解析器允许构造哪些对象。

输入还需限制大小、深度与集合数量。Java 原生对象输入可配置 ObjectInputFilter。过滤器与依赖修复需要同时落实。

13. 参考资料​