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

一风珍 阅读 59

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

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

我来解答 赞 16 收藏
二维码
手机扫码查看
2 条解答
夏侯博硕
Cookie 被篡改确实是件头疼的事儿。虽然 HttpOnly 和 Secure 标志能防止一些常见的攻击,但确实挡不住用户自己在浏览器里动手脚。这个问题的核心就是前端不能完全信任 Cookie 里的数据。

你提到后端做了签名验证,这是个好的开始。但确实需要确保每次请求都经过后端的校验。可以优化成这样:

1. 前端每次发送请求时,带上这个可能被篡改的 Cookie。
2. 后端接收到请求后,立即对这个 Cookie 进行验证。如果验证失败,直接拒绝请求。

举个简单的例子,假设你使用的是 JWT(JSON Web Token),每次请求的时候在 headers 里带上 token,后端验证这个 token 的有效性。

fetch('/api/data', {
method: 'GET',
headers: {
'Authorization': Bearer ${yourJwtToken}
}
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));


后端接收到这个请求后,会解析 Authorization 头,验证 JWT 是否有效。如果无效,返回 401 Unauthorized。

这样即使用户篡改了前端的 Cookie,只要后端每次都验证,就能有效地防止这种攻击。完全不信任 Cookie 里的任何数据是个不错的原则,但在实际操作中,通过这种方式可以在大部分情况下保证安全性。
点赞
2026-03-23 23:25
程序员焕玲
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