跨站请求伪造(CSRF)
跨站点请求伪造(Cross Site Request Forgery)又被称作 CSRF,是恶意站点或程序通过已认证用户的浏览器在受信任站点上执行非正常操作。可进行的恶意操作局限于已在网站通过身份验证的用户的功能。
例如,Jane 可能会在查看电子邮件的同时登录了她的网上银行,然后可能会点进钓鱼邮件中的自带转账请求的链接(比如迷惑性的短链接),要求 Jane 的银行转账至被攻击者控制的账户里。
由于 Jane 已经登陆了银行,该转账请求会被自动执行,因为是通过已被 Jane 授权了的浏览器发出的请求。
什么是会话cookie?
会话 cookie 是 HTTP 处理状态的一种方式(因为它本身不处理状态)。 网站使用会话 cookie(包含唯一 ID)来识别用户并保留他们的会话。
设置会话 cookie 后,用户浏览器会在每次请求时将 cookie 发送到服务器,以供站点识别用户。
攻击者可以通过强制用户浏览器发送请求并利用 cookie 来冒充用户,如果用户已经登录到站点,cookie 将随请求自动发送。
跨站点请求伪造是如何工作的?
攻击者进行 CSRF 攻击需要满足以下几点:
- 攻击者想在网站应用中执行一种操作 — 例如更改密码、转账等。
- 不包含不可猜测的请求参数 — 攻击者可以猜测(或知道)网站应用的此类请求中需要的所有参数。
- 该操作仅依赖 cookie 来验证请求是否来自用户,并可以通过 HTTP 请求执行。
另外,类似于 XSS(跨站点脚本),CSRF 可以是一个可以被存储型漏洞。 比如攻击者将攻击代码存储在被接受的 HTML 代码中就会导致存储型 CSRF(例如 IMG 或 IFRAME 标签)时。这意味着浏览该页面的任何人都可能受到影响。 该漏洞可以伪装成普通链接或隐藏在图像标签中。
如何防止 CSRF 攻击
-
使用 Anti-CSRF 令牌
类似后端的token
-
在 Cookie 中使用 SameSite 标记
SameSite 标记的 cookie,只能发送来自同域名的请求。
基本上,
www.bank.com可以被允许向www.bank.com/updatepassword提交 request 请求。 但www.maliciousdomain.com向www.bank.com/updatepassword发出请求时不能发送会话 cookie,因此无法进行攻击。现在大多数浏览器都支持这个标志,但不是全部。它应该是综合防御战略的一部分。