完整阅读本文大约需要5分钟。在开始阅读之前,先来一道面试题:CSRF攻击和XSS攻击有什么联系?什么是CSRF攻击?CSRF攻击是跨站点请求伪造,或跨站点请求伪造。说白了就是恶意网站冒充用户向受害网站发起操作请求。为了方便理解,我做了一张图。攻击过程如下:用户登录受害网站,浏览器将获取的身份凭证保存在本地cookie中;诱导用户打开黑客网站,黑客网站向受害网站服务器发起恶意请求。由于cookie的访问规则,浏览器会在第一步自动带上身份证明;受害网站服务器验证恶意请求,发现有身份证明,成功接受恶意请求;如果黑客的操作是将用户的钱转到自己的账户,那么这个时候,他就已经带着钱跑路了。如何发起CSRF攻击,诱导用户跳转到黑客网站。网站的HTML中有一个自动提交的隐藏表单。只要用户打开页面,就会发起转账请求;在受害网站评论区放置一个a标签,点击跳转时发起伪造请求;八卦大佬在受害网站评论区发了一张变相图片,其实是一张恶意请求。评论区的用户会被黑客攻击;如何防范CSRF攻击CSRF攻击有两个特点:CSRF攻击的来源通常是黑客网站(外域)),因为更好的控制;CSRF攻击无法获取用户的身份凭证,只能进行冒用;所以可以想到以下方法:验证请求的来源。HTTP请求标头中有两个字段将标识请求的来源:origin和referer。这两个字段不受前端控制,会老老实实的告诉服务端请求是从哪里来的。origin是请求源的域名部分,但是在302重定向和IE11上不会显示。所以还需要referer辅助,就是一个完整的url路径,但是可靠性不如origin。SameSitecookieCSRF攻击之所以能够成功,是因为对受害网站的所有请求都会自动加载cookie。意识到这个问题后,Chrome起草了一份协议:在向浏览器注入cookie时,开发者可以标记将带来哪些请求。标记为严格的Cookie只能在来自该域的请求中引入。跳转到新页面时可以携带标记为lax的cookie。因为如果都设置成strict的话,百度搜索打开淘宝默认是不登录的,用户体验会很差。CSRFToken在本站发起的请求中,加入攻击者无法获取的token,也可以区分正常请求和恶意请求。这个token不同于浏览器自动携带的cookie,需要前端手动携带。但是这种方案给服务器带来了很大的压力,需要维护一个session来验证接收到的token。与token相比,doublecookie不需要服务器额外扩容。只需在请求中添加一个与cookie具有相同值的额外字段。因为如前所述,攻击者获取不到cookie,但在请求时会带上。当服务器收到请求时,如果没有附加字段作为cookie值,则可以认为是来自恶意网站。其他常见的CSRF攻击大多来自第三方网站,但就像上面提到的链接跳转和图片伪装一样,来自本站的请求也可能造成威胁。所以我们还需要对UGC内容做一些过滤。当当前用户打开其他用户填写的链接时,需要告知风险;不要直接使用用户上传的图片,先保存在自己的服务器上;结论回到开头提出的问题:XSS攻击的核心是注入代码,获取用户信息;CSRF攻击的核心是利用身份凭证伪装用户发起操作请求。两者往往先后出现:黑客会先通过XSS攻击获取用户的身份证书,上传到黑客的网站,然后利用它冒充用户发起操作请求。