企业网站seo方案,带财运的公司名字,网络营销教材电子版,app定制版今日回顾
session 中间件 auth
session
Cookie虽然在一定程度上解决了“保持状态”的需求#xff0c;但是由于Cookie本身最大支持4096字节#xff0c;以及Cookie本身保存在客户端#xff0c;可能被拦截或窃取#xff0c;因此就需要有一种新的东西#xff0c;它能支持更…今日回顾
session 中间件 auth
session
Cookie虽然在一定程度上解决了“保持状态”的需求但是由于Cookie本身最大支持4096字节以及Cookie本身保存在客户端可能被拦截或窃取因此就需要有一种新的东西它能支持更多的字节并且他保存在服务器有较高的安全性。这就是Session。
问题来了基于HTTP协议的无状态特征服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。
我们可以给每个客户端的Cookie分配一个唯一的id这样用户在访问时通过Cookie服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id在服务器上保存一段时间的私密资料如“账号密码”等等。
总结而言Cookie弥补了HTTP无状态的不足让服务器知道来的人是“谁”但是Cookie以文本的形式保存在本地自身安全性较差所以我们就通过Cookie识别不同的用户对应的在Session里保存私密的信息以及超过4096字节的文本。
另外上述所说的Cookie和Session其实是共通性的东西不限于语言和框架。 Django中Session相关方法
# 获取、设置、删除Session中数据
request.session[k1]
request.session.get(k1,None)
request.session[k1] 123
request.session.setdefault(k1,123) # 存在则不设置
del request.session[k1]# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()# 会话session的key
request.session.session_key# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()# 检查会话session的key在数据库中是否存在
request.session.exists(session_key)# 删除当前会话的所有Session数据(只删数据库)
request.session.delete()# 删除当前的会话数据并删除会话的Cookie数据库和cookie都删。
request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问例如django.contrib.auth.logout() 函数中就会调用它。# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)* 如果value是个整数session会在些秒数后失效。* 如果value是个datatime或timedeltasession就会在这个时间后失效。* 如果value是0,用户关闭浏览器session就会失效。* 如果value是None,session会依赖全局session失效策略。Django中使用session时做的事 # 生成随机字符串 # 写浏览器cookie - session_id: 随机字符串 # 写到服务端session # { # 随机字符串: {user:lqz} # } Django中的Session配置 1. 数据库Session
SESSION_ENGINE django.contrib.sessions.backends.db # 引擎默认2. 缓存Session
SESSION_ENGINE django.contrib.sessions.backends.cache # 引擎
SESSION_CACHE_ALIAS default # 使用的缓存别名默认内存缓存也可以是memcache此处别名依赖缓存的设置3. 文件Session
SESSION_ENGINE django.contrib.sessions.backends.file # 引擎
SESSION_FILE_PATH None # 缓存文件路径如果为None则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存数据库
SESSION_ENGINE django.contrib.sessions.backends.cached_db # 引擎5. 加密Cookie Session
SESSION_ENGINE django.contrib.sessions.backends.signed_cookies # 引擎其他公用设置项
SESSION_COOKIE_NAME sessionid # Session的cookie保存在浏览器上时的key即sessionid随机字符串默认
SESSION_COOKIE_PATH / # Session的cookie保存的路径默认
SESSION_COOKIE_DOMAIN None # Session的cookie保存的域名默认
SESSION_COOKIE_SECURE False # 是否Https传输cookie默认
SESSION_COOKIE_HTTPONLY True # 是否Session的cookie只支持http传输默认
SESSION_COOKIE_AGE 1209600 # Session的cookie失效日期2周默认
SESSION_EXPIRE_AT_BROWSER_CLOSE False # 是否关闭浏览器使得Session过期默认
SESSION_SAVE_EVERY_REQUEST False # 是否每次请求都保存Session默认修改之后才保存默认中间件
一、什么是中间件
中间件顾名思义是介于request与response处理之间的一道处理过程相对比较轻量级并且在全局上改变django的输入与输出。因为改变的是全局所以需要谨慎实用用不好会影响到性能
作用 1 全局的请求拦截---》如果它没有登录---》就不允许访问 2 拦截所有请求获取请求的ip地址 3 记录所有用户的访问日志 4 统一在响应头中加数据
Django中间件的定义 Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output. 二、中间件有什么用
如果你想修改请求例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象这些都可以通过中间件来实现。
可能你还想在view执行之前做一些操作这种情况就可以用 middleware来实现。
Django默认的中间件在django项目的settings模块中有一个 MIDDLEWARE_CLASSES 变量其中每一个元素就是一个中间件如下图
MIDDLEWARE [django.middleware.security.SecurityMiddleware,django.contrib.sessions.middleware.SessionMiddleware, # session相关的中间件django.middleware.common.CommonMiddleware, # 公共中间件---》访问不带 / 路径如果有 带 / 的路径他会让你重定向到这个地址django.middleware.csrf.CsrfViewMiddleware, # csrf认证 django.contrib.auth.middleware.AuthenticationMiddleware, # 认证request.user---这个中间件做的django.contrib.messages.middleware.MessageMiddleware,django.middleware.clickjacking.XFrameOptionsMiddleware,
]每一个中间件都有一个具体的功能
三、自定义中间件
代码上就是一个类类中有几个方法
process_request(self,request) # 请求来了就会走
process_response(self, request, response) # 请求走了就会走
process_view(self, request, callback, callback_args, callback_kwargs) #视图函数执行之前调用
process_template_response(self,request,response) # 渲染模板之前会走
process_exception(self, request, exception) # 视图函数中出现异常了才执行
process_request和process_response 当用户发起请求的时候会依次经过所有的的中间件这个时候的请求时process_request,最后到达views的函数中views函数处理后在依次穿过中间件这个时候是process_response,最后返回给请求者。 上述截图中的中间件都是django中的我们也可以自己定义一个中间件我们可以自己写一个类但是必须继承MiddlewareMixin
第一步导入
from django.utils.deprecation import MiddlewareMixin第二步自定义中间件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponseclass Md1(MiddlewareMixin):def process_request(self,request):print(Md1请求)def process_response(self,request,response):print(Md1返回)return responseclass Md2(MiddlewareMixin):def process_request(self,request):print(Md2请求)#return HttpResponse(Md2中断)def process_response(self,request,response):print(Md2返回)return response第三步在view中定义一个视图函数index
def index(request):print(view函数...)return HttpResponse(OK)第四步在settings.py的MIDDLEWARE里注册自己定义的中间件 结果 Md1请求 Md2请求 view函数... Md2返回 Md1返回 注意如果当请求到达请求2的时候直接不符合条件返回即return HttpResponse(“Md2中断”)程序将把请求直接发给中间件2返回然后依次返回到请求者结果如下 返回Md2中断的页面后台打印如下 Md1请求 Md2请求 Md2返回 Md1返回 流程图如下 由此总结一下
中间件的process_request方法是在执行视图函数之前执行的。当配置多个中间件时会按照MIDDLEWARE中的注册顺序也就是列表的索引值从前到后依次执行的。不同中间件之间传递的request都是同一个对象
多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的也就是说第一个中间件的process_request方法首先执行而它的process_response方法最后执行最后一个中间件的process_request方法最后一个执行它的process_response方法是最先执行。 csrf认证
CSRFCross-site request forgery跨站请求伪造也被称为“One Click Attack”或者Session Riding通常缩写为CSRF或者XSRF是一种对网站的恶意利用。尽管听起来像跨站脚本XSS但它与XSS非常不同XSS利用站点内的信任用户而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比CSRF攻击往往不大流行因此对其进行防范的资源也相当稀少和难以防范所以被认为比XSS更具危险性
可以这样来理解 攻击者盗用了你的身份以你的名义发送恶意请求对服务器来说这个请求是完全合法的但是却完成了攻击者所期望的一个操作比如以你的名义发送邮件、发消息盗取你的账号添加系统管理员甚至于购买商品、虚拟货币转账等。 如下其中Web A为存在CSRF漏洞的网站Web B为攻击者构建的恶意网站User C为Web A网站的合法用户 攻击原理 如何防范
django解决了这个问题---》只要发送post请求必须携带一个csrf_token 随机字符串---后端给的 这个随机字符串可以带的位置
1 请求体中urlencodedform-data{csrfmiddlewaretokenasdfasdf}2 放在请求头中X-CSRFToken:asdfasdfasd3 ajax提交数据默认是urlencoded放在请求体中没有任何问题$.ajax({method: post,data: {username, password, csrfmiddlewaretoken},success: function (res) {console.log(res)}})4 ajax提交使用json格式---》就不能放在请求体中只能放在请求头中$.ajax({method: post,headers:{X-CSRFToken:csrfmiddlewaretoken},contentType: application/json,data: JSON.stringify({username, password}),success: function (res) {console.log(res)}}) 在form表单中应用
form action methodpost{% csrf_token %}p用户名input typetext namename/pp密码input typetext namepassword/ppinput typesubmit/p
/form在Ajax中应用
放在data里
!DOCTYPE html
html langen
headmeta charsetUTF-8script src/static/jquery-3.3.1.js/scripttitleTitle/title
/head
body
form action methodpost{% csrf_token %}p用户名input typetext namename/pp密码input typetext namepassword idpwd/ppinput typesubmit/p
/form
button classbtn点我/button
/body
script$(.btn).click(function () {$.ajax({url: ,type: post,data: {name: $([namename]).val(),password: $(#pwd).val(),csrfmiddlewaretoken: $([namecsrfmiddlewaretoken]).val()},success: function (data) {console.log(data)}})})
/script
/html放在cookie里
获取cookiedocument.cookie
是一个字符串可以自己用js切割也可以用jquery的插件
获取cookie$.cookie(‘csrftoken’)
设置cookie$.cookie(‘key’,’value’)
!DOCTYPE html
html langen
headmeta charsetUTF-8script src/static/jquery-3.3.1.js/scriptscript src/static/jquery.cookie.js/scripttitleTitle/title
/head
body
form action methodpost{% csrf_token %}p用户名input typetext namename/pp密码input typetext namepassword idpwd/ppinput typesubmit/p
/form
button classbtn点我/button
/body
script$(.btn).click(function () {var token$.cookie(csrftoken)//var token{{ csrf_token }}$.ajax({url: ,headers:{X-CSRFToken:token},type: post,data: {name: $([namename]).val(),password: $(#pwd).val(),},success: function (data) {console.log(data)}})})
/script
/html