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

客户端敏感数据处理:如何安全存储用户ID并防止篡改?

如何在客户端安全存储可检索的敏感用户数据(防篡改)

直接像示例里那样用data-user-id这类DOM属性存储用户ID的方式完全不安全——用户打开浏览器开发者工具就能随意修改值,根本起不到防篡改的作用。要实现「可检索+防篡改」的需求,得从以下几个方向入手:

方案1:使用带签名的令牌存储

把用户ID和过期时间等元数据打包,用服务端专属密钥生成HMAC签名,组成类似JWT的签名令牌,存储在localStorage、sessionStorage或Cookie中。

  • 核心逻辑:客户端拿到令牌后只能存储,无法篡改——一旦修改令牌内容,服务端验证签名时会直接失效,只有服务端能生成合法令牌。
  • 检索时,需要把令牌发送给服务端,服务端先校验签名有效性,确认无误后再提取用户ID返回给客户端。

示例代码

服务端生成令牌(伪代码):

import hmac
import hashlib
import json

# 待存储的用户数据
payload = {"user_id": 1, "exp": 1735689600}  # exp为令牌过期时间戳
server_secret = b"your_secure_server_secret_key"  # 密钥仅服务端持有,绝对不能泄露

# 生成签名
signature = hmac.new(server_secret, json.dumps(payload).encode(), hashlib.sha256).hexdigest()
# 组合成令牌
token = f"{json.dumps(payload)}.{signature}"

客户端存储与使用:

// 登录后从服务端拿到令牌,存入localStorage
localStorage.setItem("user_token", token);

// 需要用户ID时,把令牌发给服务端验证
async function getValidUserId() {
  const token = localStorage.getItem("user_token");
  const response = await fetch("/api/verify-token", {
    method: "POST",
    body: JSON.stringify({ token })
  });
  const data = await response.json();
  return data.valid ? data.user_id : null;
}

方案2:加密存储敏感数据

用对称加密算法(如AES)对用户ID加密后再存储到客户端,加密密钥由服务端在用户登录时安全下发(仅存在内存中,页面刷新后重新获取)。

  • 核心逻辑:客户端拿到的是加密后的密文,就算被篡改,解密后也得不到合法的用户ID;密钥不落地存储,降低泄露风险。
  • 注意:必须使用成熟的加密库(如crypto-js),绝对不要自己实现加密算法。

示例代码

// 从服务端获取加密密钥(仅存在内存,不持久化)
const encryptionKey = await fetch("/api/get-encryption-key").then(res => res.text());

// 加密用户ID并存储
function saveEncryptedUserId(userId) {
  const encrypted = CryptoJS.AES.encrypt(userId, encryptionKey).toString();
  localStorage.setItem("encrypted_user_id", encrypted);
}

// 检索时解密
function getDecryptedUserId() {
  const encrypted = localStorage.getItem("encrypted_user_id");
  if (!encrypted) return null;
  const bytes = CryptoJS.AES.decrypt(encrypted, encryptionKey);
  return bytes.toString(CryptoJS.enc.Utf8);
}

方案3:完全依赖服务端检索,客户端仅存会话标识

客户端不存储任何敏感数据,只存服务端生成的无意义会话标识(如Session ID),每次需要用户ID时,通过会话标识调用服务端接口获取。

  • 核心逻辑:敏感数据完全由服务端维护,客户端仅作为会话凭证的载体,从根源上避免客户端篡改风险。
  • 推荐把会话标识存在HttpOnly Cookie中,能有效防范XSS攻击窃取凭证。

示例逻辑

  1. 用户登录成功后,服务端设置HttpOnly、Secure的Cookie:Set-Cookie: session_id=abc123; HttpOnly; Secure; SameSite=Strict
  2. 客户端后续请求自动携带Cookie,服务端根据session_id查询对应的用户ID,返回给客户端使用。

关键注意事项

  • 永远不要在客户端存储明文敏感数据,哪怕是用户ID这类看似「无害」的信息,篡改后可能导致越权访问。
  • 无论采用哪种方案,服务端都必须做最终的权限校验——不能完全信任客户端传来的任何数据。
  • 使用Cookie存储凭证时,务必配置HttpOnly、Secure、SameSite属性,降低XSS和CSRF攻击风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:23:09