【问题标题】:How do I get access to rails session in the console?如何在控制台中访问 Rails 会话?
【发布时间】:2020-09-10 17:01:04
【问题描述】:

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

_some_session=RXF6SVF5RHdV...

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

> session[RXF6SVF5RHdV...]

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

【问题讨论】:

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


    【解决方案1】:

    这是一个也适用于非基于 cookie 的会话的答案。 IE。通常,您将保存在 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
    

    【讨论】:

    • 不适用于 CookieStore(rails 默认)。
    【解决方案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. 
    

    【讨论】:

    • @P0lska 您忘记通过单击答案中的向上箭头来投票了 :)
    • 对我不起作用。我的会话 cookie 中没有“--”。我收到错误“TypeError(不兼容的编组文件格式(无法读取))”
    • 原来我使用的是 ActiveRecord 存储,所以我不得不根据会话 ID 查找它
    猜你喜欢
    • 2011-08-07
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2017-06-20
    • 2016-09-10
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多