django的signed_cookie

本文探讨了signed_cookie的工作原理及其在防止用户篡改cookie中的作用。解释了signed_cookie如何通过添加签名而非加密来保护数据,并介绍了Django框架中实现signed_cookie的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

signed_cookie 只是加了签名的 cookie, 而不是被加密的 cookie.在客户端还是可以看到没有加密的value的

signed_cookie 的作用是防止用户私自纂改.参考: Securing Web Cookies With Signatures

So once I’ve logged in, we set a username cookie containing “Michael Brunton-Spall”, or uid=1 or something.
The problem with this is that the user is in total control of this cookie

单纯的记录 uid 或者用户名在 cookie 中很容易被篡改(也是不建议将用户敏感信息记录在cookie中的原因), 万一攻击者把uid=1换成uid=2岂不是可以访问 uid=2用户的资源了吗? 而如果换成uid=2:1fPjh2:iQGDDYNcgSYkIFqa2ixqakj6-gI那么服务端不仅检验uid, 还检验uid=2后面的签名字段, 即是调用HttpRequest.get_signed_cookie(key=key, salt=salt), 这样即使用户把 cookie 中的 value 换成 uid=2, 但是没有签名, 服务端照样拒绝访问资源.

另外, Django 的 cookie 签名是用的Base64_with_hmac, 参考: Source code for django.core.signing

如果需要在 cookie 里设置被加密的 value, 需要自行对 value 进行加密(好像只能是对称加密), 比如使用hashlib.sha256{参考: hashlib — Secure hashes and message digests}:

>>> import hashlib
>>> hashlib.sha256(b"value").hexdigest()
'cd42404d52ad55ccfa9aca4adc828aa5800ad9d385a0671fbcbf724118320619'

说句题外话, 
对于 json 格式的字符串的加密, 目前推荐的方案是 JWT 规范, 参考: Introduction to JSON Web Tokens, 同样也是把信息暴露给了用户(但是一般的用户不能直接通过 token 看到信息, 需要稍加解密, 用户也不可能修改加密后的内容).
需要比较根本地防止中间人攻击, 加上 https 会是比较明智的选择.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值