zhouqi1208 2024-05-19 13:29 采纳率: 100%
浏览 15
已结题

token被截取后,模拟用户登录

网上很多文章说用token替代 cookie,作为登录凭证。目的是防止CSRF攻击。但实际上token如果当做是身份认证的话。如果,token被截取,窃取者既可以用用户的身份登录系统。感觉更不安全了。
唯一可以锁定的发送者的IP,但如果,用户用局域网的多台电脑。公网IP一样怎么解决呢。脑壳痛


// 请求拦截器
axios.interceptors.request.use(
    (config:any)=>{
        config.headers['Access-Token'] =store.getters[Consts.MutationKey.GET_FRONT_ACCESS_TOKEN]
        config.headers['utcOffset'] = new Date().getTimezoneOffset();
        return config;
    },
    error => Promise.reject(error)
)
  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-19 13:29
    关注

    引自免费微信小程序:皆我百晓生

    在设计一个安全的身份验证系统时,确实需要考虑诸如CSRF(跨站请求伪造)攻击等多种安全威胁。Token的确是一种有效的防御手段,但需要正确地管理和使用它。对于您提出的关于Token被截取的问题,我们可以从以下几个方面进行改进:

    1. 短生命周期:为每个Token设置一个相对较短的有效期,一旦过期就需要重新获取新的Token。这将减少Token被盗用的时间窗口。
    2. 一次性Token:对于某些敏感操作,可以使用一次性Token,即在一个特定的操作(如支付、密码更改等)完成后就失效。
    3. 绑定设备/浏览器指纹:除了IP地址外,还可以尝试绑定用户的设备信息,例如User-Agent(浏览器标识)、屏幕分辨率等,形成一种弱化的设备指纹。这些信息可以通过JavaScript获取并存储在服务器端,然后在后续请求中验证。
    4. 会话管理:结合使用Cookie和Token,Cookie用于存储session_id,而Token仅用于安全要求较高的API调用。这样即使Token被盗,也无法立即获得完整的会话控制权。
    5. 加密Token:对Token进行加密,使其难以直接解析,增加攻击难度。同时,在客户端存储时也要确保安全,比如使用浏览器的localStorage加密功能。
    6. CSRF Token:在表单提交时,添加一个隐藏的CSRF Token字段,并且每次页面加载时生成一个新的值。这个Token在服务器端验证,确保请求来自已授权的页面。
    7. HTTP-only Cookie:对于敏感信息,如session_id,应将其设置为HTTP-only,防止通过JavaScript访问,从而降低XSS攻击风险。

    针对您的代码示例,可以做一些修改来增强安全性:

    import crypto from 'crypto'; // 导入加密库
    
    const generateRandomString = () => {
      return crypto.randomBytes(16).toString('hex'); // 生成16字节的随机字符串
    };
    
    // 在响应登录请求时,生成一个唯一的Session ID和一个Token
    export const handleLogin = async (req, res) => {
      // ...处理登录逻辑...
      const sessionId = generateRandomString(); // 生成新的Session ID
      const accessToken = generateRandomString(); // 生成新的AccessToken
      const refreshToken = generateRandomString(); // 可选,用于刷新令牌机制
    
      // 将Session ID存储到服务器端,与用户关联
      await saveSession(sessionId, userId);
    
      // 设置Cookie,注意设置httpOnly和secure属性
      res.cookie('session_id', sessionId, { httpOnly: true, secure: process.env.NODE_ENV === 'production' });
    
      // 返回给客户端的响应体包含AccessToken和RefreshToken
      res.json({ accessToken, refreshToken });
    };
    
    // 请求拦截器中的更新
    axios.interceptors.request.use(
      (config) => {
        const accessToken = store.getters[Consts.MutationKey.GET_FRONT_ACCESS_TOKEN];
        const utcOffset = new Date().getTimezoneOffset();
    
        // 添加Authorization头,可以使用Bearer或者其他方式
        config.headers.Authorization = `Bearer ${accessToken}`;
    
        // 如果有refresh_token并且快要过期,可以尝试刷新
        if (store.getters[Consts.MutationKey.GET_FRONT_REFRESH_TOKEN]) {
          checkAndRefreshAccessToken();
        }
    
        config.headers['utcOffset'] = utcOffset;
        return config;
      },
      (error) => Promise.reject(error)
    );
    

    以上方案提供了一种更加安全的身份验证实现,但请根据实际项目需求进行调整。同时,确保使用HTTPS传输数据以保护通信内容的安全性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月27日
  • 已采纳回答 5月19日
  • 创建了问题 5月19日

悬赏问题

  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请