68 lines
4.3 KiB
Markdown
68 lines
4.3 KiB
Markdown
---
|
||
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)。
|
||
|
||
**追问**:为什么图片也要限制?→ 攻击者可以通过提示词注入让模型输出 ``,浏览器加载图片时就把数据发出去了。
|
||
|
||
### 【场景题】你的 Agent 可以“访问用户提供的链接”,评审时要考虑什么?
|
||
|
||
**参考答案**:SSRF(内网和元数据地址)、重定向、DNS 重绑定、响应大小和超时、内容中的提示词注入(抓回来的网页可能包含“忽略之前的指令”)、隐私(是否允许访问带有个人信息的链接)。措施:URL 校验 + 出口代理 + 内容作为不可信数据处理 + 工具调用审计。
|
||
|
||
**追问**:怎么证明防住了?→ 用攻击载荷清单(内网 IP、各种 IP 写法、重定向到内网、非 http 协议)写成测试,在 CI 中运行,见[示例测试](examples/secure-api/test_secure_app.py)。
|