问题一:Cookie能解决什么问题?(用户跟踪,解决HTTP协议无状态问题)
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引擎:
- 基于数据库(默认模式)
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可能会影响网站的使用)
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以前的默认)- 因为安全问题不推荐使用,但是只要不去反序列化用户构造的恶意和Payload其实也没有什么风险。关于这种方式的安全漏洞,可以参考《Python Pickle的任意代码执行漏洞实践和Payload构造》一文或《软件架构-Python语言实现》上关于这个问题的讲解。
说明:如果使用了django-redis整合Redis作为session的存储引擎,那么忧郁django-redis又封装了一个PickieSerializer来提供系列化,所以上述问题不会存在,且Redis中保存的value是pickie序列化之后的结果
网友评论