解码Django用户的sessiondata,在Lua中编码为base64

时间:2013-12-05 11:08:32

标签: python django lua

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

session_data = "NzlmZjZmNWQxMGIzNTQzMDZhNDZjNzJiZGQ4OWZiY2NjNDg0NDVlZTqAAn1xAShVEl9hdXRoX3VzZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZHEDVQ1fYXV0aF91c2VyX2lkcQSKAgEKdS4="
用于解码会话数据的我的Lua代码是

-- decode base64 code fetch from django session data
local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
local function dec(data)
    data = string.gsub(data, '[^'..b..'=]', '')
    return (data:gsub('.', function(x)
        if (x == '=') then return '' end
        local r,f='',(b:find(x)-1)
       for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end
        return r;
    end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if (#x ~= 8) then return '' end
        local c=0
        for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end
        return string.char(c)
    end))
end

当我跑步时print(dec(session_data))我正在

output = 79ff6f5d10b354306a46c72bdd89fbccc48445ee:�}q(U_auth_user_backendqU)django.contrib.auth.backends.ModelBackendqU _auth_user_idq� u. 

虽然输出假设是像我们的Django那样

{'_auth_user_id': 2561L, '_auth_user_backend': 'django.contrib.auth.backends.ModelBackend'}

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

2 个答案:

答案 0 :(得分:1)

快速谷歌搜索会产生this blog post

这是他必须对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)

换句话说,你的期望是错误的。 un-base64-ed数据包含校验和散列(79ff6...445ee),后跟:,后跟序列化(通过pickle)python数据(�}q(U_auth..._user_idq� u.)。

如果您真的想了解如何解码python拾取的数据,请参阅PEP 307

答案 1 :(得分:0)

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