You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤登录请求响应,移除多余headers与config敏感数据

问题根因

axios发送请求后返回的完整响应对象默认包含data(后端返回的业务数据)、status、statusText、headers、config、request六个字段,你最初的代码直接将整个响应对象存入了Redux和localStorage,config字段中会保留请求时传入的账号密码等敏感参数,才会出现安全风险。

解决步骤
  • 第一步:清理缓存避免旧代码影响
    先删除浏览器中已存储的旧userInfo localStorage数据,停止本地开发服务后重新启动编译,确保修改后的代码完全生效。
  • 第二步:修正请求取值与存储逻辑
    你修改为解构data的写法是正确的,要确保dispatch和存储localStorage两个位置都使用解构后的业务数据,参考修正后的代码:
export const signin = (email, password) => async (dispatch) => {
  dispatch({type: user.USER_SIGNIN_REQUEST, payload: {email, password}})
  try {
    // 解构axios响应对象,仅取业务数据字段
    const { data } = await axios.post("/api/users/login", {email, password})
    dispatch({type: user.USER_SIGNIN_SUCCESS, payload: data})
    localStorage.setItem("userInfo", JSON.stringify(data))
  } catch(err) {
    // 修正原错误处理的逻辑漏洞:原写法err.response不存在时访问err.response.data会抛出异常
    dispatch({
        type: user.USER_SIGNIN_ERROR, 
        payload: err.response?.data?.message ?? err.message
    })
  }
}
  • 第三步:增加数据显式提取逻辑(可选推荐)
    为了避免后续接口返回结构变动意外带入冗余信息,你可以显式提取需要的业务字段,完全杜绝敏感信息被写入存储的可能:
const { data: rawRes } = await axios.post("/api/users/login", {email, password})
const formattedUserInfo = {
  id: rawRes.id,
  name: rawRes.name,
  email: rawRes.email,
  role: rawRes.role,
  message: rawRes.message,
  token: rawRes.token
}
dispatch({type: user.USER_SIGNIN_SUCCESS, payload: formattedUserInfo})
localStorage.setItem("userInfo", JSON.stringify(formattedUserInfo))

额外安全建议
  • 不要在任何持久化存储(Redux持久化、localStorage、sessionStorage)中保存用户密码,你当前的USER_SIGNIN_REQUEST action中携带的账号密码仅用于请求触发,不要将该payload的内容存入持久化状态。
  • 如果项目中使用了redux-persist之类的Redux状态持久化插件,需要将登录请求相关的临时状态排除在持久化名单之外。

内容的提问来源于stack exchange,提问作者Alex Motor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 11:42:03