前端安全系列-csrf攻击

2,563 阅读5分钟

前面学习了 xss攻击的相关知识点,现在接着了解下 csrf攻击

什么是csrf攻击

csrf 全称跨站请求伪造(Cross-site request forgery),指的是攻击者携带网站cookie,冒充用户请求的攻击行为。

与 xss攻击 的区别

xss攻击主要指网站被攻击者利用漏洞恶意注入脚本并执行,是一种注入类攻击;csrf 描述的是攻击者携带cookie冒充用户的请求行为,它们属于两种不同维度上的分类。

可以预想的是,如果 xss攻击的执行脚本包含请求服务器的行为,其也会携带用户cookie达到冒充用户请求的行为,这时候也属于 csrf攻击,不过我们一般称这样的情况为 xsrf攻击。

经典的csrf攻击过程

  1. 用户C打开a网站,向服务器A发送请求进行登录

  2. 登陆验证通过,服务器返回cookieA

  3. cookieA被保存在浏览器中,生命周期默认为浏览器关闭

  4. 在浏览器未关闭的情况下(A域名的cookie还在),用户被攻击者诱导打开b网站

  5. 在网站b中,向服务器A发送跨域请求

  6. 在网站b的请求中浏览器为其自动携带上了服务器A的cookie

  7. 服务器A分析请求cookie得到此请求为用户C发起,正确处理网站b的请求

需要明确的是,浏览器设置和携带cookie是根据请求中服务器的域名来设置和获取的,而非请求所在网站域名。所以,用户首次在网站a请求服务器A得到的cookie对应服务器A的域名,在网站b中再次请求时也会携带服务器A域名下的cookie。其实仔细想想,如果cookie对应的是网站请求方的域名,那么一个网站如果请求多个服务器域名的话,那么它们之间的cookie很可能冲突,而且也无法通过cookie来做单点登陆了。

csrf的防范

  1. 验证 HTTP Referer 字段

HTTP 的 Referer 字段记录了该 HTTP 请求的来源(网址)。通过 HTTP Referer 可以判断请求所在的网址,进而拦截外站的非法请求。

使用这中方式防范 CSRF 的应当注意

  • 请求发起者可以设置不携带 Referer,重定向也不会携带 Referer

  • Referer 由浏览器携带,也可能由于浏览器的实现差异导致问题,或者因为浏览器安全漏洞导致被篡改。

  • 对于页面请求来说,要注意 Referer 可能是搜索引擎页面

关于 Referer 的知识可以参考阮一峰老师的HTTP Referer 教程

  1. 使用验证码校验

对于重要操作如支付来说,可以使用验证码验证用户身份。

  1. CSRF Token

CSRF 的本质在于盗用用户的 Cookie 信息然后作为用户凭证冒充用户的操作,如果在验证用户流程中多加个 CSRF Token 的验证,判断 Cookie 是否来自用户网站。那么第三网址发起的请求虽然携带 Cookie 但是获取不到用户网站的 CSRF Token,就可以在服务端设置拦截。

CSRF TOken 可以放置在请求参数中,也可以放在自定义 HTTP 头部字段。但是放在请求中可能由于 Get 请求被放置在 URL 中,再跳转第三方网站时被 Referer 携带泄露。所以推荐放在 HTTP 头部字段中

  1. 双重Cookie

csrf攻击的原因是请求会自动携带 Cookie,我们可以利用 JS 无法获取跨域 Cookie 的同源限制。发送请求时携带 Cookie 参数,服务器端校验开发者携带的 Cookie 和浏览器自动携带的 Cookie 是否一致来判断是否为正常请求。

双重 Cookie 有以下限制

  • Cookie 二级域名的跨域问题(Domain 设置为主域可能会由于其它子域被攻击而导致安全问题)

  • 无法设置 Cookie 的 HttpOnly

  • Cookie 导致请求数据加大,资源浪费

  1. 利用 Cookie 的新属性 SameSite

现代浏览器将 Cookie 的 SameSite 设置为 Lax 其实已经将大部分跨域请求都设置为不再携带 Cookie。当然如果设置为 Strict 就可以完全避免跨域携带 Cookie 了。具体详见做一个真正懂cookie的前端

使用 SameSite 严格模式的缺点

  • 新标签重新打开也不携带 Cookie,需要用户重复登录

  • 二级域名无法共享 Cookie,需要用户重复登录

  1. 检测、监控
  • CSRF检测工具:CSRFTester

  • CSRF监控:代理层统一拦截监控

  1. 防止网站被利用
  • 严格管理所有的上传接口,防止任何预期之外的上传内容(例如HTML)。

  • 添加Header X-Content-Type-Options: nosniff 防止黑客上传HTML内容的资源(例如图片)被解析为网页。

  • 对于用户上传的图片,进行转存或者校验。不要直接使用用户填写的图片链接。

  • 当前用户打开其他用户填写的链接时,需告知风险(这也是很多论坛不允许直接在内容中发布外域链接的原因之一,不仅仅是为了用户留存,也有安全考虑)。

总结

CSRF攻击利用了浏览器跨域自动携带 Cookie 的特点,我们可以从不同维度防范与减少 CSRF攻击的风险。对于前端安全这块,我也是刚刚开始学习和研究,如果有错误的地方,欢迎大家指出。

参考


欢迎来前端学习打卡群一起学习~516913974