Skip to content

XSS攻击与CSRF攻击

约 1532 字大约 5 分钟

前端开发安全

2025-06-27

XSS 攻击

什么是XSS攻击?

跨站脚本 (XSS) 攻击允许 攻击者在受害者的浏览器中执行恶意 JavaScript 代码。当网站未能正确验证用户输入或对输出进行适当转义时,就会发生此攻击。

XSS 攻击可用于窃取会话 cookie、劫持用户会话、更改网页内容、将用户重定向到恶意网站、进行网络钓鱼攻击、传播恶意软件等,从而 导致用户的敏感信息泄露或其他类型的损失

XSS 攻击的主要类型

  • 反射型 XSS (Reflected XSS)

    这是最常见的类型。攻击者的恶意脚本通过 URL 参数、表单输入或 HTTP 头等方式“反射”到目标网站上,然后返回给受害者的浏览器执行。这种攻击通常需要受害者点击一个特制链接或提交特定的表单。攻击是一次性的,不会持久化

  • 存储型 XSS (Stored XSS/Persistent XSS)

    恶意脚本存储在目标服务器上(数据库、留言板、评论区、用户个人资料等位置)。当其他用户访问包含恶意脚本的内容时,它会在他们的浏览器中执行。由于其持久性,存储型 XSS 通常被认为比反射型 XSS 更危险,因为它可以影响多个用户

  • 基于 DOM 的 XSS (DOM Based XSS)

    与前两种不同,这种类型的 XSS 不涉及服务器端处理,恶意脚本完全在客户端执行。攻击者利用客户端 JavaScript 代码中的漏洞,将恶意脚本注入到网页的 DOM 中。这通常发生在 JavaScript 代码直接从用户输入或 URL 中获取数据并将其写入 DOM 时,而没有进行适当的过滤或转义。

防范 XSS 攻击的措施

  • 输入验证和过滤:

  • 对所有用户输入进行严格的验证和过滤,拒绝包含潜在危险字符的输入。使用白名单方法,只允许已知的安全字符。

  • 输出编码/转义: 在将数据输出到浏览器之前,应对其进行适当的 HTML 编码、JavaScript 编码、URL 编码等,以防止浏览器将其解释为可执行代码。根据数据的上下文选择合适的编码方式。

  • 使用安全的 API: 尽可能使用安全库和框架提供的、能够自动防御 XSS 攻击的功能,例如使用框架提供的模板引擎或 HTML 净化器。

  • 内容安全策略 (CSP): CSP 是一个 HTTP 响应头,它允许网站管理员控制允许浏览器加载哪些资源,从而减少 XSS 攻击的风险。CSP 可以限制脚本的来源、阻止内联脚本执行、禁止eval()函数等。

  • HttpOnly Cookie: 将重要的 Cookie(例如会话 ID)设置为 HttpOnly,可以防止 JavaScript 代码访问这些 Cookie,从而 mitigating XSS 攻击窃取 Cookie 的风险。

CSRF 攻击

什么是CSRF攻击?

CSRF(跨站请求伪造)攻击是指攻击者诱导用户访问恶意网站或点击恶意链接,在用户不知情的情况下,利用用户已登录的身份向目标网站发送恶意请求,从而冒充用户执行非法操作,例如更改密码、转账、发布信息等。

CSRF 攻击的原理

  1. 用户登录目标网站:用户在目标网站登录后,浏览器保存了用户的认证信息(例如 Cookie 或本地存储)。

  2. 用户访问恶意网站:用户 在未登出目标网站的情况下,访问了攻击者控制的恶意网站

  3. 恶意网站发送伪造请求:恶意网站通过隐藏的表单、JavaScript 代码、图片标签等方式,向目标网站发送伪造的请求。

  4. 目标网站执行请求:目标网站收到请求时,由于浏览器自动附带了用户的认证信息,目标网站无法区分请求是来自用户还是攻击者,因此会执行请求

CSRF 预防方法

  • 使用 Anti-CSRF Token (Synchronizer Token Pattern): 服务器生成一个不可预测的随机 Token,并将其嵌入到表单或 URL 中。客户端在提交请求时,必须将 Token 与请求一起发送。服务器验证 Token 的有效性和一致性,如果 Token 无效或不匹配,则拒绝请求

  • 设置 SameSite Cookie 属性: SameSite 属性可以控制 Cookie 在跨站请求中的行为。SameSite=Strict 可以有效防止 CSRF 攻击,但可能会影响用户体验SameSite=Lax 提供了一定的保护,同时保持了较好的用户体验。

  • 验证 Referer 和 Origin Header: 服务器可以检查 HTTP 请求头中的 RefererOrigin 字段,以验证请求的来源。但是,这些字段并非总是可靠的,因为它们可能会被浏览器或代理服务器修改或删除。

  • 双重提交 Cookie (Double Submit Cookie): 服务器生成一个伪随机值,并将其设置为 Cookie 和隐藏表单字段。客户端提交表单时,服务器会比较 Cookie 值和表单字段值,如果两者匹配,则接受请求。

  • 避免使用 GET 请求进行状态更改操作: GET 请求应该只用于获取数据,而不应该用于修改数据或执行敏感操作。所有状态更改操作都应该使用 POST 请求。

  • 要求用户二次确认: 对于敏感操作(例如转账、修改密码),要求用户进行二次确认,例如输入密码、验证码或通过其他身份验证方式确认。