如何防范CSRF(跨域请求伪造)?

发布时间 2023-06-05 20:48:32作者: coooooookie

1、什么是CSRF?

跨域请求伪造指的是第三方诱导用户点击含攻击信息的网站,利用用户在目标网站的凭证冒充用户进行操作。

 

 2、如何解决?

方法一:同源检测

HTTP 请求头 Referrer 字段是浏览器默认带上,含义是发送请求的页面地址,比如同样是删除相册的操作如果是从相册自己页面发送出来,Referrre的值是(以首页举例),如果是从黑客页面发送出来的Referrer的值是(以首页举例),所以后端只要通过Referrrer做白名单判断就能防这种常见的CSRF攻击。

方法二:token

传统的cookie和session会把用户信息存储在客户端的Cookie里,浏览器在请求服务端接口时会自动在Cookie头中带上用户信息。而JWT令牌可以存储在localStorage,和Cookie不同的是它不会自动在请求中携带令牌,需要通过代码来实现。前端在请求头里添加token,并且后端设置拦截器进行验证token,这样就能防止CSRF攻击。

3、JWT实现原理

对比传统的session认证方式,JWT的优势是:

1、JWT Token数据量小,传输速度也很快。因为JWT Token是以JSON加密形式保存在客户端

2、不需要在服务端保存会话信息,也就是说不依赖于cookie和session,所以没有了传统session认证的弊端,特别适用于分布式微服务

3、单点登录友好:使用Session进行身份认证的话,由于cookie无法跨域,难以实现单点登录。但是,使用token进行认证的话, token可以被保存在客户端的任意位置的内存中,不一定是cookie,所以不依赖cookie,不会存在这些问题

JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串

签名哈希部分是对上面两部分数据签名,需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名