跳到主要内容

CSRF 攻击

什么是CSRF 攻击

CSRF 攻击指的是跨站请求伪造攻击,攻击者诱导用户进入一个第三 方网站,然后该网站向被攻击网站发送跨站请求。如果用户在被攻击 网站中保存了登录状态,那么攻击者就可以利用这个登录状态,绕过 后台的用户验证,冒充用户向服务器执行一些操作。 CSRF 攻击的本质是利用 cookie 会在同源请求中携带发送给服务器 的特点,以此来实现用户的冒充。

CSRF 攻击类型

GET 类型的 CSRF 攻击,比如在网站中的一个 img 标签里构建一个 请求,当用户打开这个网站的时候就会自动发起提交。

POST 类型的 CSRF 攻击,比如构建一个表单,然后隐藏它,当用户 进入页面时,自动提交这个表单。

链接类型的 CSRF 攻击,比如在 a 标签的 href 属性里构建一个请 求,然后诱导用户去点击。

如何防止 CSRF 攻击

  1. 验证来源(Origin Validation):服务器端可以验证请求的来源是否合法。比较常用的方法是检查请求头中的 Referer 字段或 Origin 字段,确保请求来自同一域名下的合法页面。这样可以防止攻击者在恶意网站上伪造请求。

  2. CSRF Token(令牌验证):在每个用户会话中生成一个随机的令牌(CSRF Token),并将其包含在表单或请求头中。服务器端在接收到请求时验证令牌的合法性。只有当请求中包含有效的令牌时,才认为是合法的请求,否则拒绝处理。这样可以防止攻击者伪造请求,因为攻击者无法获取到合法用户的令牌。

  3. SameSite Cookie:设置 Cookie 的 SameSite 属性为 Strict 或 Lax。这样可以限制 Cookie 的跨站传递,只允许同一站点的请求携带 Cookie。当浏览器遵循 SameSite 属性设置时,跨站请求伪造攻击的风险将大大降低。

  4. 双重提交Cookie(Double Submit Cookie):将一个与用户会话相关的 Cookie 值设置为表单字段的值。服务器在接收到请求时,比较 Cookie 值和表单字段的值是否一致,以确认请求的合法性。这种方法可以防止攻击者在未知 Cookie 值的情况下伪造请求。

  5. 随机化请求参数(Request Parameter Randomization):在每个请求中添加一个随机化的参数,该参数由服务器生成并与用户会话关联。服务器在接收到请求时,验证请求参数的合法性。这样可以使攻击者难以猜测请求的参数值,提高防御效果。

  6. 用户身份验证和授权:在进行敏感操作时,要求用户再次进行身份验证,比如输入密码、进行指纹验证等。这样可以确保只有授权的用户才能执行敏感操作,即使攻击者成功伪造了请求。