前面学习了 xss攻击的相关知识点,现在接着了解下 csrf攻击
什么是csrf攻击
csrf 全称跨站请求伪造(Cross-site request forgery),指的是攻击者携带网站cookie,冒充用户请求的攻击行为。
与 xss攻击 的区别
xss攻击主要指网站被攻击者利用漏洞恶意注入脚本并执行,是一种注入类攻击;csrf 描述的是攻击者携带cookie冒充用户的请求行为,它们属于两种不同维度上的分类。
可以预想的是,如果 xss攻击的执行脚本包含请求服务器的行为,其也会携带用户cookie达到冒充用户请求的行为,这时候也属于 csrf攻击,不过我们一般称这样的情况为 xsrf攻击。
经典的csrf攻击过程
-
用户C打开a网站,向服务器A发送请求进行登录
-
登陆验证通过,服务器返回cookieA
-
cookieA被保存在浏览器中,生命周期默认为浏览器关闭
-
在浏览器未关闭的情况下(A域名的cookie还在),用户被攻击者诱导打开b网站
-
在网站b中,向服务器A发送跨域请求
-
在网站b的请求中浏览器为其自动携带上了服务器A的cookie
-
服务器A分析请求cookie得到此请求为用户C发起,正确处理网站b的请求
需要明确的是,浏览器设置和携带cookie是根据请求中服务器的域名来设置和获取的,而非请求所在网站域名。所以,用户首次在网站a请求服务器A得到的cookie对应服务器A的域名,在网站b中再次请求时也会携带服务器A域名下的cookie。其实仔细想想,如果cookie对应的是网站请求方的域名,那么一个网站如果请求多个服务器域名的话,那么它们之间的cookie很可能冲突,而且也无法通过cookie来做单点登陆了。
csrf的防范
- 验证 HTTP Referer 字段
HTTP 的 Referer 字段记录了该 HTTP 请求的来源(网址)。通过 HTTP Referer 可以判断请求所在的网址,进而拦截外站的非法请求。
使用这中方式防范 CSRF 的应当注意
-
请求发起者可以设置不携带 Referer,重定向也不会携带 Referer
-
Referer 由浏览器携带,也可能由于浏览器的实现差异导致问题,或者因为浏览器安全漏洞导致被篡改。
-
对于页面请求来说,要注意 Referer 可能是搜索引擎页面
关于 Referer 的知识可以参考阮一峰老师的HTTP Referer 教程
- 使用验证码校验
对于重要操作如支付来说,可以使用验证码验证用户身份。
- CSRF Token
CSRF 的本质在于盗用用户的 Cookie 信息然后作为用户凭证冒充用户的操作,如果在验证用户流程中多加个 CSRF Token 的验证,判断 Cookie 是否来自用户网站。那么第三网址发起的请求虽然携带 Cookie 但是获取不到用户网站的 CSRF Token,就可以在服务端设置拦截。
CSRF TOken 可以放置在请求参数中,也可以放在自定义 HTTP 头部字段。但是放在请求中可能由于 Get 请求被放置在 URL 中,再跳转第三方网站时被 Referer 携带泄露。所以推荐放在 HTTP 头部字段中
- 双重Cookie
csrf攻击的原因是请求会自动携带 Cookie,我们可以利用 JS 无法获取跨域 Cookie 的同源限制。发送请求时携带 Cookie 参数,服务器端校验开发者携带的 Cookie 和浏览器自动携带的 Cookie 是否一致来判断是否为正常请求。
双重 Cookie 有以下限制
-
Cookie 二级域名的跨域问题(Domain 设置为主域可能会由于其它子域被攻击而导致安全问题)
-
无法设置 Cookie 的 HttpOnly
-
Cookie 导致请求数据加大,资源浪费
- 利用 Cookie 的新属性 SameSite
现代浏览器将 Cookie 的 SameSite 设置为 Lax 其实已经将大部分跨域请求都设置为不再携带 Cookie。当然如果设置为 Strict 就可以完全避免跨域携带 Cookie 了。具体详见做一个真正懂cookie的前端。
使用 SameSite 严格模式的缺点
-
新标签重新打开也不携带 Cookie,需要用户重复登录
-
二级域名无法共享 Cookie,需要用户重复登录
- 检测、监控
-
CSRF检测工具:CSRFTester
-
CSRF监控:代理层统一拦截监控
- 防止网站被利用
-
严格管理所有的上传接口,防止任何预期之外的上传内容(例如HTML)。
-
添加Header X-Content-Type-Options: nosniff 防止黑客上传HTML内容的资源(例如图片)被解析为网页。
-
对于用户上传的图片,进行转存或者校验。不要直接使用用户填写的图片链接。
-
当前用户打开其他用户填写的链接时,需告知风险(这也是很多论坛不允许直接在内容中发布外域链接的原因之一,不仅仅是为了用户留存,也有安全考虑)。
总结
CSRF攻击利用了浏览器跨域自动携带 Cookie 的特点,我们可以从不同维度防范与减少 CSRF攻击的风险。对于前端安全这块,我也是刚刚开始学习和研究,如果有错误的地方,欢迎大家指出。
参考
欢迎来前端学习打卡群一起学习~516913974