前言
HTTP 是一个无状态的协议,比如需要账号密码登录的网站这个场景,为了避免每次都需要重复输入,有一种方案就是Cookie,具体使用不做赘述,但是这样带来了一些安全问题。跨站请求伪造(CSRF)攻击是一种利用网站间信任关系的攻击方式。攻击者诱使受害者在用户的浏览器中执行不安全的操作,而用户在不知情的情况下发送请求,这些请求包含了对于受信任站点有效的身份验证信息。
CSRF原理
- 用户登录:用户访问并登录一个受信任的网站A,例如银行网站,登录成功后浏览器会保存这个网站的认证信息(如Cookie)。
- 攻击嵌入:攻击者通过电子邮件、论坛、社交媒体等渠道,诱使用户访问一个恶意网站B。这个恶意网站上嵌入了对网站A进行操作的请求代码,比如修改密码、转账等操作的请求。
- 自动请求:当用户访问这个恶意网站B时,嵌入在网站B中的恶意代码会自动向网站A发送请求。由于用户浏览器中已经保存了网站A的认证信息(比如Cookies),这些请求会被网站A误认为是用户自愿发起的,且认证合法。
- 执行操作:网站A接收到这些恶意请求后,由于认证信息有效,会执行请求中的操作,如转账、修改密码等。这些操作实质上是未经用户同意的,但由于网站A无法区分这些请求是否真正由用户发起,因而导致攻击成功。
防范措施
- 使用CSRF Token:网站为每次用户会话生成一个随机的请求令牌(CSRF Token),并在前端页面中嵌入。所有的请求都需要包含这个令- 牌,服务器验证令牌是否匹配,从而防止外部的恶意请求。
- 验证Referer头:验证请求的来源,确保请求是从受信任的来源发出的。
- SameSite Cookie属性:适当设置Cookie的SameSite属性,来限制第三方网站对Cookie的访问,可以减少CSRF攻击的风险。