天天看點

關于rails中 cookie-session 和 protect_from_forgery 的了解

cookie-session

rails從2.0版本以後,都預設采用了在browser的cookie中儲存session資料的方式,是以儲存在session中的資料不能超過4K,否則會出現CookieOverflow的例外。

在session中一般儲存有user_id和flash的内容,在使用了protect_from_forgery後,還會儲存有_csrf_token的字段。此外,可能還會有session_id的字段,但是由于session内容是儲存在單獨的cookie中,而不是資料庫中,是以在使用cookie-session的時候,這個session_id并沒有實際的意義。

session中的資料在儲存在cookie中時是先marshal後,然後利用密碼來加密的。假設session的内容是data,那麼實際在cookie中的内容就會是如下形式

marshal(data)---digest_with_secret_key(marshal(data))      

這裡在加密時所用的secret key就是在config/initializer/session_store.rb中所設定的serect字段;而在該檔案中設定的key字段,就是儲存在browser中的cookie的名稱。

protect_from_forgery

rails2.0以後的版本都會預設開啟該選項(在application_controller.rb中),它會利用儲存在cookie中的_csrf_token字段來生成自動添加在form中的隐藏字段_authenticity_token,然後利用_authenticity_token來實作CSRF的功能。

繼續閱讀