默認情況下,導軌使用cookie存儲會話信息。我跟隨的教程說這是最好的方式,速度超快,而且它都被加密。但是,當我base64解碼cookie內容時,我可以在那裏看到我的會話信息。它混入了很多亂碼字符,但它在那裏。在導軌中加密會話信息
我在這裏錯過了什麼?
沒有軌道使用該祕密令牌的東西來加密cookie中的信息?我怎樣才能做到這一點?
默認情況下,導軌使用cookie存儲會話信息。我跟隨的教程說這是最好的方式,速度超快,而且它都被加密。但是,當我base64解碼cookie內容時,我可以在那裏看到我的會話信息。它混入了很多亂碼字符,但它在那裏。在導軌中加密會話信息
我在這裏錯過了什麼?
沒有軌道使用該祕密令牌的東西來加密cookie中的信息?我怎樣才能做到這一點?
Rails使用祕密令牌登錄會話。原始數據仍然存在,但更改它將導致它不再匹配簽名,Rails將拒絕它。 cookie字符串看起來像session_data--signature
,會話數據是base64編碼的編組對象,簽名是HMAC(session string, secret token)
。
會話數據的一般假設是它不是祕密的(因爲它通常應該只包含一些東西,如CSRF令牌和用戶ID),但它不應該由用戶更改。 Cookie簽名完成了這一點。
如果您需要實際加密數據以便用戶永遠不會看到數據,則可以使用類似OpenSSL對稱加密的方式進行此操作,也可以切換到非cookie數據存儲。
這是我自己應用程序的Cookie存儲中的變體;我沒有測試過它,但理論上這應該爲您生成實際加密的cookie。請注意,這將比默認的Cookie存儲慢得多,並且根據其運行時間,可能會成爲DOS向量。此外,加密的數據比未加密的數據更長,會話cookie有4kb的限制,所以如果你在會話中存儲了大量數據,這可能會導致你超過這個限制。
# Define our message encryptor
module ActiveSupport
class EncryptedMessageVerifier < MessageVerifier
def verify(message)
Marshal.load cryptor.decrypt_and_verify(message)
end
def generate(value)
cryptor.encrypt_and_sign Marshal.dump(value)
end
def cryptor
ActiveSupport::MessageEncryptor.new(@secret)
end
end
end
# And then patch it into SignedCookieJar
class ActionDispatch::Cookies::SignedCookieJar
def initialize(parent_jar, secret)
ensure_secret_secure(secret)
@parent_jar = parent_jar
@verifier = ActiveSupport::EncryptedMessageVerifier.new(secret)
end
end