解码Django用户的会话数据,该数据在Lua中被编码到base64中



我使用redis和Lua从Django项目中获取任何管理员的sessiondata。在Django工程中,sessiondata被编码为base64格式。
sessiondata值为:

session_data="NzlmZjZmNWQxMGIzNTQzMDZhNDZjNzJiZGQ4OWZiY2NjNDg0NDVLZTqAAn1xAShVEl9hdXRoX3VzZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2 VuZHEDVQ1fYXV0aF91c2VyX2lkcQSKAgEKdS4="
我解码会话数据的Lua代码是
--解码从django会话数据中提取的base64代码local b='BCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnomqrstuvxyz0123456789+'局部函数dec(数据)data=string.gsub(data,'[^'..b.'=]','')return(数据:gsub('.',function(x)if(x=='=')则返回''end局部r,f=",(b:find(x)-1)对于i=6,1,-1做r=r。。(f%2^i-f%2^(i-1)>0且"1"或"0"结束返回r;end):gsub("%d%d%d?%d?%d!%d?%d",函数(x)如果(#x~=8),则返回"结束局部c=0对于i=1,8 do c=c+(x:sub(i,i)=='1'和2^(8-i)或0)端return string.char(c)完)终止

当我运行print(dec(session_data))时,我得到

输出=79ff6f5d10b354306a46c72bdd89fbccc48445e:�}q(U_auth_user_backendqU)django.contrib.auth.backends.ModelBackendqU _auth_user_idq�u

而输出假定为

{'_auth_user_id':2561L,'_auth_user_backend':'django.contrib.auth.backends.ModelBackend'}
就像Django一样。

请让我知道我做错了什么。

在谷歌上快速搜索会得到这篇博客文章。

这是他必须解码sessiondata:的(删节的、未验证的)python代码

def decode(session_data, secret_key, class_name='SessionStore'):
    encoded_data = base64.b64decode(session_data)
    utoken, pickled = encoded_data.split(b':', 1)
    return pickle.loads(pickled)

换句话说,你的期望是错误的。未基于64字节的数据包含校验和散列(79ff6...445ee),然后是:,然后是序列化(通过pickle)的python数据(�}q(U_auth..._user_idq� u.)。

如果您真的想了解如何解码python选择的数据,请参阅PEP307。

如果您使用的是django 1.5.3+,您可以使用json序列化程序,这样您就不必尝试在lua中解码python pickle;)Json序列化程序在django 1.6+中是默认的。

最新更新