問(wèn)題一:Cookie能解決什么問(wèn)題?(用戶跟蹤,解決HTTP協(xié)議無(wú)狀態(tài)問(wèn)題)
1.URL重寫(xiě)
http://www.abc.com/path/resource?foo=bar
2.隱藏域(隱式表單域)- 埋點(diǎn)
<form action="" method="post">
<input type="hiden" name="foo" value="bar">
</form>
3.Cookie-瀏覽器中的臨時(shí)文件(文本文件)-BASE64
問(wèn)題2:Cookie和Session之間的關(guān)系是 什么?(Session的標(biāo)識(shí)通過(guò)Cookie保存和傳輸)
Session的配置
Session對(duì)應(yīng)的中間件:django.contrib.sessions.middleware.SessionMiddleware
2.Session引擎:
- 基于數(shù)據(jù)庫(kù)(默認(rèn)模式)
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相關(guān)的配置。
SESSION_COOKIE_NAME = ‘django_session_id’
SESSION_COOKIE_AGE = 1209600
#如果設(shè)置為True,Cookie就是基于瀏覽器窗口的Cookie,不會(huì)持久化
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()
- 銷毀會(huì)話 -
set_test_cookie()
/test_cookie_worked
/
delete_test_cookie()
-測(cè)試瀏覽器是否支持Cookie(提示用戶如果瀏覽器禁用Cookie可能會(huì)影響網(wǎng)站的使用)
5.session的序列化
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
- JSONSrializer(1.6及以后默認(rèn)) - 如果想將自定義的對(duì)象放到Session中,會(huì)遇到‘Object of type ‘XXX’ is not JSON serializable’的問(wèn)題(如果配置使用Redis保存Session,django-redis使用了Pickie序列化,這個(gè)問(wèn)題就不存在了)。
- PickieSerializer(1.6以前的默認(rèn))- 因?yàn)榘踩珕?wèn)題不推薦使用,但是只要不去反序列化用戶構(gòu)造的惡意和Payload其實(shí)也沒(méi)有什么風(fēng)險(xiǎn)。關(guān)于這種方式的安全漏洞,可以參考《Python Pickle的任意代碼執(zhí)行漏洞實(shí)踐和Payload構(gòu)造》一文或《軟件架構(gòu)-Python語(yǔ)言實(shí)現(xiàn)》上關(guān)于這個(gè)問(wèn)題的講解。
說(shuō)明:如果使用了django-redis整合Redis作為session的存儲(chǔ)引擎,那么憂郁django-redis又封裝了一個(gè)PickieSerializer來(lái)提供系列化,所以上述問(wèn)題不會(huì)存在,且Redis中保存的value是pickie序列化之后的結(jié)果