如何从 django_session 表的 session_data 中查找用户 ID?
在django_session
表中存储session_data
,该表首先使用Python的pickle模块进行pickle,然后使用Python的base64模块进行base64编码。
我得到了解码后的 pickle session_data
。
django_session
表中的 session_data
:
gAJ9cQEoVQ9fc2Vzc2lvbl9leHBpcnlxAksAVRJfYXV0aF91c2VyX2JhY2tlbmRxA1UpZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmRxBFUNX2F1dGhfdXNlcl9pZHEFigECdS5iZmUwOWExOWI0YTZkN2M0NDc2MWVjZjQ5ZDU0YjNhZA==
通过 base64.decode(session_data) 解码后:
\x80\x02}q\x01(U\x0f_session_expiryq\x02K\x00U\x12_auth_user_backendq\x03U)django.contrib.auth.backends.ModelBackendq\x04U\r_auth_user_idq\x05\x8a\x01\x02u.bfe09a19b4a6d7c44761ecf49d54b3ad
我想从 中找出
。auth_user_id
的值auth_user_idq\x05\x8a\x01\x02u
In django_session
table session_data
is stored which is first pickled using pickle module of Python and then encoded in base64 by using base64 module of Python.
I got the decoded pickled session_data
.
session_data
from django_session
table:
gAJ9cQEoVQ9fc2Vzc2lvbl9leHBpcnlxAksAVRJfYXV0aF91c2VyX2JhY2tlbmRxA1UpZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmRxBFUNX2F1dGhfdXNlcl9pZHEFigECdS5iZmUwOWExOWI0YTZkN2M0NDc2MWVjZjQ5ZDU0YjNhZA==
after decoding it by base64.decode(session_data):
\x80\x02}q\x01(U\x0f_session_expiryq\x02K\x00U\x12_auth_user_backendq\x03U)django.contrib.auth.backends.ModelBackendq\x04U\r_auth_user_idq\x05\x8a\x01\x02u.bfe09a19b4a6d7c44761ecf49d54b3ad
I want to find out the value of auth_user_id
from auth_user_idq\x05\x8a\x01\x02u
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我对保罗的方法遇到了麻烦(请参阅我对他的答案的评论),所以我最终使用了 scottbarnham.com 博客文章:
I had trouble with Paulo's method (see my comment on his answer), so I ended up using this method from a scottbarnham.com blog post:
注意:格式自原始答案以来已更改,对于 1.4 及更高版本,请参阅下面的更新
[更新]
我真的不知道为什么我使用 base64 模块,我想是因为这个问题以它为特色。
您可以只使用
str.decode
方法:从用户源(cookies)加载腌制数据存在安全风险,因此自从这个问题得到解答以来,session_data 格式已更改(我应该跟踪 Django 错误跟踪器中的特定问题并将其链接到此处,但我的番茄钟休息时间消失了)。
现在的格式(自 Django 1.4 起)是“hash:json-object”,其中前 40 字节哈希是加密签名,其余是 JSON 有效负载。现在您可以忽略哈希值(它允许检查数据是否未被某些 cookie 黑客篡改)。
NOTE: format changed since original answer, for 1.4 and above see the update below
[update]
I really don't know why I used the base64 module, I guess because the question featured it.
You can just use the
str.decode
method:Loading pickled data from user sources (cookies) is a security risk, so the session_data format was changed since this question was answered (I should go after the specific issue in Django's bug tracker and link it here, but my pomodoro break is gone).
The format now (since Django 1.4) is "hash:json-object" where the first 40 byte hash is a crypto-signature and the rest is a JSON payload. For now you can ignore the hash (it allows checking if the data was not tampered by some cookie hacker).
如果您想了解更多信息并了解编码或解码是如何工作的,这里有一些相关代码。
顺便说一句,我使用的 Django 版本是 1.9.4。
django/contrib/sessions/backends/base.py
django/contrib/sessions/serializer.py
让我们重点关注SessionBase的encode函数。
因此,解码是相反的。
我们可以在下面的代码中简化解码函数。
这就是 session.get_decoded() 所做的。
If you want to learn more about it and know how does encode or decode work, there are some relevant code.
By the way the version of Django that i use is 1.9.4.
django/contrib/sessions/backends/base.py
django/contrib/sessions/serializer.py
Let's focus on SessionBase's encode function.
So, decode is inverse.
We can simplify the decode function in the following code.
And that what session.get_decoded() did.
我想使用最新版本的 DJango (2.05) 在纯 Python 中完成此操作。这就是我所做的:
I wanted to do this in pure Python with the latest version of DJango (2.05). This is what I did:
我只需要在 Django 安装上解决类似的问题。我知道用户的 ID (36),并且想要删除该特定用户的会话数据。我想将此代码作为原型来构建,以便在会话数据中查找用户:
希望这对任何人都有帮助。
I just had to solve something like this on a Django install. I knew the ID (36) of the user and wanted to delete the session data for that specific user. I wanted to put this code out as a prototype to build from for finding a user in session data:
Hope this helps anyone out there.