Cookie被篡改了怎么办?如何保证前端收到的Cookie没被用户修改?

一风珍 阅读 4

我们后端设置了登录态的 Cookie,但发现有些用户手动改了 Cookie 里的 userId,然后就能访问别人的数据。明明后端做了签名验证,但前端有时候还是会拿到被篡改过的值,比如用 DevTools 改成 userId=123 这种。

我试过加 HttpOnly 和 Secure 标志,但好像只能防 XSS,防不了用户自己改啊?是不是应该完全不信任 Cookie 里的任何数据?还是说必须每次请求都让后端重新校验?

我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
程序员焕玲
Cookie防篡改很简单——签名验证。

服务端设置Cookie时用密钥做个HMAC签名,一起存进Cookie。读取时重新计算签名对比,不一致就直接当无效处理。用户改的了值,改不了签名。

// 设置Cookie时
$value = '123';
$signature = hash_hmac('sha256', $value, $secretKey);
setcookie('userId', $value, time()+3600, '/', '', true, true);
setcookie('userId_sig', $signature, time()+3600, '/', '', true, true);

// 读取时验证
$userId = $_COOKIE['userId'] ?? '';
$signature = $_COOKIE['userId_sig'] ?? '';
$expected = hash_hmac('sha256', $userId, $secretKey);

if (!hash_equals($expected, $signature)) {
// 签名不对,直接当没登录或返回错误
http_response_code(401);
exit('Invalid cookie');
}


省事的话直接用现成的库,比如PHP的slim框架或Laravel自带这套,配置一下密钥就行。核心就是:Cookie里存的值可以明文,但必须带签名,后端每次请求都验签名。
点赞
2026-03-12 13:29