django5
1.COOKIE
1.1 HTTP长/短连接
HTPP长连接:当前通话结束后不会立马断开连接,在一定时间内再次连接会记录状态
HTTP短连接:不会记录之前的状态,当前通话结束就断开连接,不会记录状态,下次访问时要重新建立连接
长连接相当于打电话中间不会中断,会持续保持通话状态
短连接就是不会持续保持状态,每次结束都要重新连接
1.2状态保持
Cookie及
Session一直以来都是Web开发中非常关键的一环,因为
HTTP协议本身为无状态,每一次请求之间没有任何状态信息保持,往往我们的Web服务无法在客户端访问过程中得知用户的一些状态信息,比如是否登录等等;那么这里通过引入
Cookie或者
Seesion`来解决这个问题
1.3什么是COOKIE
当客户端访问时,服务端会为客户端生成一个Cookie
键值对数据,通过Response
响应给到客户端。当下一次客户端继续访问相同的服务端时,浏览器客户端就会将这个Cookie
值连带发送到服务端
1.4 COOKIE运行图
1.5创建cookie
class CookieView(View):
def get(self,request):
cookie_data = request.COOKIES.get('shenfen')
if cookie_data is None:
resp = HttpResponse('设置cookie')
resp.set_cookie('shenfen','vip')
return resp
else:
return HttpResponse(f'当前信息为{cookie_data}')
1.6删除cookie
class DelCookieView(View):
def get(self,request):
resp = HttpResponse('删除cookie信息')
resp.delete_cookie('shenfen')
return resp
1.7通过网页删除cookie
2.Session
2.1Session的的原理
虽然说有了Cookie
之后,我们把一些信息保存在客户端浏览器中,可以保持用户在访问站点时的状态,但是也存在一定的安全隐患,Cookie
值被曝露,Cookie
值被他人篡改,等等。我们将换一种更健全的方式,也就是接下来要说的Session
。
Session
在网络中,又称会话控制,简称会话。用以存储用户访问站点时所需的信息及配置属性。当用户在我们的Web
服务中跳转时,存储在Session
中的数据不会丢失,可以一直在整个会话过程中存活
2.2框架是如何存储管理Session的
在django
中,默认的Session
存储在数据库中session
表里。默认有效期为两个星期。
2.3如何获取session
示例
class SessionView(View):
def get(self,request):
session_data = request.session.get('money')
if session_data is None:
request.session['money']='100000'
return HttpResponse('设置session')
else :
return HttpResponse(f"session信息为{session_data}")
获取session两种的方法
session_data = request.session.get(Key)
session_data = request.session[Key]
get方法:
如果key没有值,不回发生异常,会返回None(为空)
”第二种方法
如果没有key值会直接报错
2.4删除session方法
示例
class DelSession(View):
def get(self,request):
if request.session.get('money') is None:
return HttpResponse('sessions不存在')
else:
del request.session['money']
return HttpResponse('sessions已删除')
del request.seesion[Key]
删除对应session,Key值不存在时,发生报错
request.session.clear()
清空Session中的所有数据。这里客户端还会保留sessionid;
只不过在服务端sessionid对应的数据没有
2.5删除总结
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
3. csrf
3.1什么是csrf
CSRF(Cross-site request forgery):跨站请求伪造。
3.2CSRF 攻击模拟实现
用户是网站 A 的注册用户,且登录进去,于是网站 A 就给用户下发 cookie。
从上图可以看出,要完成一次 CSRF 攻击,受害者必须满足两个必要的条件:
(1)登录受信任网站 A,并在本地生成 Cookie。(如果用户没有登录网站 A,那么网站 B 在诱导的时候,请求网站 A 的 api 接口时,会提示你登录)
(2)在不登出 A 的情况下,访问危险网站 B(其实是利用了网站 A 的漏洞)。
我们在讲 CSRF 时,一定要把上面的两点说清楚。
温馨提示一下,cookie 保证了用户可以处于登录状态,但网站 B 其实拿不到 cookie
3.3如何防止CSRF攻击
讨论 GET 和 POST 两种请求,对于 GET,其实也没什么需要防范的。为什么?
因为 GET 在 “约定” 当中,被认为是查询操作,查询的意思就是,你查一次,查两次,无数次,结果都不会改变(用户得到的数据可能会变),这不会对数据库造成任何影响,所以不需要加其他额外的参数。
所以这里要提醒各位的是,尽量遵从这些约定,不要在 GET 请求中出现 /delete, /update, /edit 这种单词。把 “写” 操作放到 POST 中。
对于 POST,服务端在创建表单的时候可以加一个隐藏字段,也是通过某种加密算法得到的。在处理请求时,验证这个字段是否合法,如果合法就继续处理,否则就认为是恶意操作。