以前项目中遇到了SameSite
的使用, SameSite
主要解决CSRF (Cross Site Request Forgery)
问题,顺便也回顾下CSRF
吧。html
利用被攻击网站服务器对用户网页浏览器的信任。前端
当用户浏览恶意网页时,攻击者经过一些技术手段欺骗用户的浏览器去访问一个用户曾经认证过的网站并运行一些操做(如发邮件,发消息,甚至财产操做如转帐和购买商品)。由于请求也是携带认证cookie信息的,服务端没有合适的防护措施的话就很难识别请求是用户正常请求仍是CSRF
请求。git
结合原理和CSRF
命名能够看出CSRF
的特色:github
攻击者不要获取用户的信息(cookie等),直接欺骗用户的浏览器,让其以用户的名义运行操。web
直接引入前端安全系列之二:如何防止CSRF攻击?的DEMO:segmentfault
受害者登陆a.com,并保留了登陆凭证(Cookie)。
攻击者引诱受害者访问了b.com。
b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。
a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误觉得是受害者本身发送的请求。
a.com以受害者的名义执行了act=xx。
攻击完成,攻击者在受害者不知情的状况下,冒充受害者,让a.com执行了本身定义的操做。
针对CSRF
的攻击原理,制定防护策略:后端
攻击来自第三方站点:浏览器
Referer
字段[[科普]跨站请求伪造-CSRF防御方法](https://www.freebuf.com/artic...缓存
CSRF
攻击中,Referer
是没法伪造的,可是维护比较困难;Referer
配置不许确的话,很容易阻断正常请求;Referer
;总之不推荐使用安全
token
并验证[[科普]跨站请求伪造-CSRF防御方法](https://www.freebuf.com/artic...
利用token
标记合法请求。
CSRF token
的生成,下发,上送,校验由服务端生成随机惟一的字符串(GUID, UUID等),并保存到服务端的session
或者其余服务端缓存(如Redis);
token
的缓存最好有过时时间;token
的安全性能够对生成的token
进行对称加密
。下发是服务端如何把生成的CSRF token
传给客户端,方式不少了,看客户端怎么方便提取并传给后端。
Set-Cookie
下发;上送:是客户端调用接口时提取CSRF token
并传给服务。看请求接口类型也后不少上送方式。
GET
请求能够放入queryString里;Form POST
请求能够添加隐藏域;AJAX
, fetch
请求还能够采用放入request header里;token
;CSFR
重要的场景都须要而且建议采用token
方案,一些常见的case有: