如何在控制台中访问rails会话?

时间:2018-03-19 04:31:29

标签: ruby-on-rails session ruby-on-rails-5

假设我已经从浏览器请求中复制了cookie的字符串。

_some_session=RXF6SVF5RHdV...

我想打开rails控制台并粘贴类似

的内容
> session[RXF6SVF5RHdV...]

从会话中检索解密数据。如果可以,我该怎么做?

2 个答案:

答案 0 :(得分:2)

是的,有可能,这里有更详细的方法,打开你的rails控制台试试这个:

content = 'BAh7CEkiD3Nlc3Npb25faWQGOgZFRkkiJTgwZGFiNzhiYWZmYTc3NjU1ZmVmMGUxM2EzYmEyMDhhBjsAVEkiFGdpdGh1Yl91c2VybmFtZQY7AEZJIhJuZWVyYWpkb3RuYW1lBjsARkkiEF9jc3JmX3Rva2VuBjsARkkiMU1KTCs2dXVnRFo2R2NTdG5Kb3E2dm5BclZYRGJGbjJ1TXZEU0swamxyWU09BjsARg%3D%3D--b5bcce534ceab56616d4a215246e9eb1fc9984a4'

假设内容是您的会话cookie,

当内容写入cookie时,它将被转义。所以首先我们需要揭开它。

> unescaped_content = URI.unescape(content)
=> "BAh7CEkiD3Nlc3Npb25faWQGOgZFRkkiJTgwZGFiNzhiYWZmYTc3NjU1ZmVmMGUxM2EzYmEyMDhhBjsAVEkiFGdpdGh1Yl91c2VybmFtZQY7AEZJIhJuZWVyYWpkb3RuYW1lBjsARkkiEF9jc3JmX3Rva2VuBjsARkkiMU1KTCs2dXVnRFo2R2NTdG5Kb3E2dm5BclZYRGJGbjJ1TXZEU0swamxyWU09BjsARg==--b5bcce534ceab56616d4a215246e9eb1fc9984a4"

请注意,到最后unescaped_content有 - 。这是一个分离标记。之前的值 - 是真实的有效载荷。之后的值是数据的摘要。

> data, digest = unescaped_content.split('--')
=> ["BAh7CEkiD3Nlc3Npb25faWQGOgZFRkkiJTgwZGFiNzhiYWZmYTc3NjU1ZmVmMGUxM2EzYmEyMDhhBj  VEkiFGdpdGh1Yl91c2VybmFtZQY7AEZJIhJuZWVyYWpkb3RuYW1lBjsARkkiEF9jc3JmX3Rva2VuBjsARkkiMU1KTCs2dXVnRFo2R
2NTdG5Kb3E2dm5BclZYRGJ
GbjJ1TXZEU0swamxyWU09BjsARg==", "b5bcce534ceab56616d4a215246e9eb1fc9984a4"]

The data is Base64 encoded. So let’s unecode it.
> Marshal.load(::Base64.decode64(data))
=> {"session_id"=>"80dab78baffa77655fef0e13a3ba208a",
    "github_username"=>"manoj910",
    "_csrf_token"=>"MJL+6uugDZ6GcStnJoq6vnArVXDbFn2uMvDSK0jlrYM="}
So we are able to get the data that is stored in cookie. 

答案 1 :(得分:1)

这是一个也适用于非基于cookie的会话的答案。即通常,您要保存在Cookie中的全部是会话ID。现在,有了会话ID,您可以像这样使用会话存储(文件,缓存,ActiveRecord)独立地查找会话数据:

def lookup_session_data(session_id)
  session_store = Rails.application.config.session_store.new nil, {}
  _id, data = session_store.find_session({}, Rack::Session::SessionId.new(session_id))

  data if data.present?
end

session_id = "..."
lookup_session_data session_id