Errata: Sessões em Rails

No meu livro Ruby on Rails: Coloque sua aplicação web nos trilhos, há um capítulo sobre sessões e cookies, em que eu falo:

O Rails já sabe disso e sabe a melhor maneira de prever ataques como esse.
E é justamente essa a grande diferença entre o cookie e o session
- o session é encriptado usando uma chave "mágica", de forma que o usuário
nunca saberá o conteúdo do cookie e, portanto, dificilmente conseguirá forjar
uma sessão.

Isso está errado. No Rails 3, as sessões do Rails estão apenas codificadas usando Base 64 e assinadas, usando HMAC-SHA1. Ou seja, as mensagens não são encriptadas, portanto é possível ler a sessão quando se tem acesso aos cookies. Veja o exemplo abaixo, de uma sessão do Colcho.net:

session = "BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJTBkM2FmNTlkNDcy\
N2VhNDJkZTRhYzE4YjQ0Yjc5OGJkBjsAVEkiEF9jc3JmX3Rva2VuBjsARkki\
MVh1NFMvUWJnOG9pQ0NsbjRkbnducFhTZXEzaUl0NDArVkFQVHVTZi9CZlE9\
BjsARg%3D%3D--100ae84bad4e222ebd17a30f44dac7424549e94f"

data, digest = session.split('--')
Marshal.load(Base64.decode64(data))

O resultado é:

{
    "session_id"=>"0d3af59d4727ea42de4ac18b44b798bd",
    "_csrf_token"=>"Xu4S/Qbg8oiCCln4dnwnpXSeq3iIt40+VAPTuSf/BfQ="
}

Esse código está na classe MessageVerifier, do ActiveSupport.

Esta informação tem sido notícia recentemente, por causa de uma nova funcionalidade no Rails 4: cookies encriptados de fato. Para usá-lo, basta alterar o seu session_store.rb:

ColchoNet::Application.config.session_store :encrypted_cookie_store, key: '_colcho_net_session'

Ainda é possível migrar as sessões dos seus usuários do cookie store para o encrypted cookie store usando o upgrade_signature_to_encryption_cookie_store. Mais informações, veja a documentação.