CSRF介绍和防御

CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式。CSRF 攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行一些需要认证身份的操作。

举例说明,比如现在存在正常需要访问的A网站,黑客的B网站,和用户C。

CSRF介绍和防御_第1张图片

要完成一次CSRF攻击,用户需要完成两步:

1.登录受信任网站,并在本地生成Cookie

2.在不登出A的情况下(确保session会话没有过期),访问危险网站B

CSRF防御

1.验证HTTP Referer字段

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。当用户C登录信任的网站A,发送的http请求头中referer都是指向网站A的域名地址。而黑客csrf发送的请求头中referer指向的是网站B的域名。所以,后端根据这个referer字段可以简单易行的判断是否csrf漏洞。不过这种方法把安全性依赖到浏览器本身,并不安全,如果用户设置浏览器使其在发送请求时不再提供 Referer,那么网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。

2.在请求地址中添加token并验证

csrf的关键在于,黑客可以轻松仿造用户的请求,验证用户身份的信息存放在Cookie中,所以可以直接使用Cookie来通过验证。要防御CSRF,关键在于请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。用户在登录成功后,服务器端使用JWT创建一个token返回给前端,并把token存到session中。这样每次当服务器收到请求时,如果请求没有token或者验证token不正确,就拒绝请求。不过这种方法要对于每一个请求都加上token,很麻烦,容易漏掉。另外,对于页面中的每一个a链接和form表单,都加上token,如果页面中存在用户发布内容的地方,黑客发布自己web的链接,也能很容易获取到token。

3.在HTTP头中自定义属性并验证

类似上面那种方案,把token放置到header中去。但是这种方法只适用于XMLHttpRequest做Ajax请求。

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(js)