問題一:Cookie能解決什么問題晶通?(用戶跟蹤胁孙,解決HTTP協(xié)議無狀態(tài)問題)
1.URL重寫
http://www.abc.com/path/resource?foo=bar
2.隱藏域(隱式表單域)- 埋點
<form action="" method="post">
<input type="hiden" name="foo" value="bar">
</form>
3.Cookie-瀏覽器中的臨時文件(文本文件)-BASE64
問題2:Cookie和Session之間的關系是 什么只锻?(Session的標識通過Cookie保存和傳輸)
Session的配置
Session對應的中間件:django.contrib.sessions.middleware.SessionMiddleware
2.Session引擎:
- 基于數(shù)據(jù)庫(默認模式)
INSTALLED_APPS = [
'django.contrib.sessions',
]
- 基于緩存(推薦使用)
SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’
SESSION_CACHE_ALIAS = 'session'
- 基于文件(基本不考慮)
- 基于Cookie(不靠譜)
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
3.Cookie相關的配置傅是。
SESSION_COOKIE_NAME = ‘django_session_id’
SESSION_COOKIE_AGE = 1209600
#如果設置為True团驱,Cookie就是基于瀏覽器窗口的Cookie沮尿,不會持久化
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_SAVE_EVERY_REQUEST = False
SESSION_COOKIE_HTTPONLY = True
4.sessioln的屬性和方法丛塌。
-
session_key
/session_data
/expire_data
-
__getitem__
/__settime__
/__delitem__
/contains
-
flush()
- 銷毀會話 -
set_test_cookie()
/test_cookie_worked
/
delete_test_cookie()
-測試瀏覽器是否支持Cookie(提示用戶如果瀏覽器禁用Cookie可能會影響網(wǎng)站的使用)
5.session的序列化
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
- JSONSrializer(1.6及以后默認) - 如果想將自定義的對象放到Session中,會遇到‘Object of type ‘XXX’ is not JSON serializable’的問題(如果配置使用Redis保存Session畜疾,django-redis使用了Pickie序列化赴邻,這個問題就不存在了)。
- PickieSerializer(1.6以前的默認)- 因為安全問題不推薦使用啡捶,但是只要不去反序列化用戶構(gòu)造的惡意和Payload其實也沒有什么風險姥敛。關于這種方式的安全漏洞,可以參考《Python Pickle的任意代碼執(zhí)行漏洞實踐和Payload構(gòu)造》一文或《軟件架構(gòu)-Python語言實現(xiàn)》上關于這個問題的講解瞎暑。
說明:如果使用了django-redis整合Redis作為session的存儲引擎徒溪,那么憂郁django-redis又封裝了一個PickieSerializer來提供系列化,所以上述問題不會存在金顿,且Redis中保存的value是pickie序列化之后的結(jié)果