CSRF 攻击
什么是CSRF 攻击
CSRF 攻击指的是跨站请求伪造攻击,攻击者诱导用户进入一个第三 方网站,然后该网站向被攻击网站发送跨站请求。如果用户在被攻击 网站中保存了登录状态,那么攻击者就可以利用这个登录状态,绕过 后台的用户验证,冒充用户向服务器执行一些操作。 CSRF 攻击的本质是利用 cookie 会在同源请求中携带发送给服务器 的特点,以此来实现用户的冒充。
CSRF 攻击类型
GET 类型的 CSRF 攻击,比如在网站中的一个 img 标签里构建一 个 请求,当用户打开这个网站的时候就会自动发起提交。
POST 类型的 CSRF 攻击,比如构建一个表单,然后隐藏它,当用户 进入页面时,自动提交这个表单。
链接类型的 CSRF 攻击,比如在 a 标签的 href 属性里构建一个请 求,然后诱导用户去点击。
如何防止 CSRF 攻击
-
验证来源(Origin Validation):服务器端可以验证请求的来源是否合法。比较常用的方法是检查请求头中的 Referer 字段或 Origin 字段,确保请求来自同一域名下的合法页面。这样可以防止攻击者在恶意网站上伪造请求。
-
CSRF Token(令牌验证):在每个用户会话中生成一个随机的令牌(CSRF Token),并将其包含在表单或请求头中。服务器端在接收到请求时验证令牌的合法性。只有当请求中包含有效的令牌时,才认为是合法的请求,否则拒绝处理。这样可以防止攻击者伪造请求,因为攻击者无法获取到合法用户的令牌。
-
SameSite Cookie:设置 Cookie 的 SameSite 属性为 Strict 或 Lax。这样可以限制 Cookie 的跨站传递,只允许同一站点的请求携带 Cookie。当浏览器遵循 SameSite 属性设置时,跨站请求伪造攻击的风险将大大降低。
-
双重提交Cookie(Double Submit Cookie):将一个与用户会话相关的 Cookie 值设置为表单字段的值。服务器在接收到请求时,比较 Cookie 值和表单字段的值是否一致,以确认请求的合法性。这种方法可以防止攻击者在未知 Cookie 值的情况下伪造请求。
-
随机化请求参数(Request Parameter Randomization):在每个请求中添加一个 随机化的参数,该参数由服务器生成并与用户会话关联。服务器在接收到请求时,验证请求参数的合法性。这样可以使攻击者难以猜测请求的参数值,提高防御效果。
-
用户身份验证和授权:在进行敏感操作时,要求用户再次进行身份验证,比如输入密码、进行指纹验证等。这样可以确保只有授权的用户才能执行敏感操作,即使攻击者成功伪造了请求。