真实面经题目 · 原创解析
XSS 和 CSRF 的区别、原理和防御方式是什么?
XSS 和 CSRF 都属于 Web 安全问题,但攻击面不同。XSS 是让恶意脚本在可信页面里执行,CSRF 是诱导已登录浏览器向可信站点发起非预期请求。防御要分别围绕脚本执行边界和请求意图校验来设计。
真实面经题目 · 原创解析
XSS 和 CSRF 都属于 Web 安全问题,但攻击面不同。XSS 是让恶意脚本在可信页面里执行,CSRF 是诱导已登录浏览器向可信站点发起非预期请求。防御要分别围绕脚本执行边界和请求意图校验来设计。
可以先用一句话区分:XSS 攻击用户看到和执行的页面内容,CSRF 攻击用户已经建立的登录态。XSS 的原理是把不可信输入变成页面可执行脚本,常见类型有存储型、反射型和 DOM 型,防御重点是按上下文输出编码、富文本白名单清洗、CSP、HttpOnly Cookie、框架默认转义和依赖治理。CSRF 的原理是浏览器会自动携带目标站点 Cookie,攻击者虽然通常读不到响应,却能触发转账、改密码、发帖等状态变更操作。防御重点是 SameSite Cookie、CSRF Token、Origin 或 Referer 校验、关键操作二次确认,以及避免用 GET 做有副作用的动作。测试时要分别覆盖输入注入点、渲染上下文、状态变更接口、跨站触发路径和浏览器策略差异。
XSS 的目标是让恶意脚本进入并执行在可信页面上下文中,进而读取页面数据、发起操作或劫持用户交互。CSRF 的目标不是注入脚本,而是借用用户已经登录的浏览器身份,让目标站点收到一笔看似来自用户的合法请求。一个偏内容执行,一个偏请求伪造。
XSS 通常来自不可信输入没有被正确处理,例如评论、昵称、搜索词、URL 参数或前端拼接 HTML。存储型会把 payload 写入服务端并影响后续访问者,反射型依赖当前请求回显,DOM 型发生在前端脚本处理 URL、消息或接口数据时。关键风险在于输入跨过了数据和代码的边界。
CSRF 利用浏览器对 Cookie 和认证信息的自动携带机制。攻击者可以通过表单提交、跳转、图片请求或部分简单跨域请求触发目标站点接口。即使攻击者不能读取响应,只要接口只依赖 Cookie 认证且缺少请求意图校验,状态变更就可能成功。
XSS 防御不能只靠过滤某个关键字,而要按渲染上下文处理。HTML 文本、属性、URL、JavaScript 字符串和 CSS 的编码规则不同;富文本要做白名单清洗;模板引擎默认转义不要随意关闭;CSP 能降低脚本执行面;HttpOnly Cookie 能减少会话凭据被脚本读取的风险。
CSRF 防御要证明请求确实来自用户在本站的交互。常见手段包括 SameSite Cookie 限制跨站携带、每次表单或请求携带不可预测的 CSRF Token、校验 Origin 或 Referer、敏感操作要求密码或验证码确认。接口设计上还应避免 GET 修改状态,并保证关键操作具备幂等和审计能力。
不能。HttpOnly 只能阻止脚本直接读取 Cookie,但 XSS 脚本仍然可以在当前页面发起请求、读页面数据、诱导用户操作或篡改 DOM。它是降低会话泄露风险的措施,不是 XSS 的根治方案。
不能简单认为可以。CORS 主要控制跨域读取响应和非简单请求的许可,传统表单提交等路径仍可能带上 Cookie 发起状态变更。CSRF 仍需要 Token、SameSite、Origin 校验等机制。
多数现代场景下 SameSite 很有价值,但不宜作为唯一防线。需要考虑老浏览器、跨站登录跳转、第三方嵌入、子域关系和特殊业务流程。高风险操作仍建议配合 Token 或二次确认。
XSS payload 不只存在于 script 标签,还可能出现在事件属性、URL 协议、SVG、样式、模板注入和前端 DOM API 中。正确做法是按上下文编码和白名单清洗,而不是依赖黑名单。