今日学习目标
- Django中间件、csrf跨站请求伪造了解学习
文章目录
学习内容
- django操作session
- CBV添加装饰器的三种方式
- django中间件
- csrf跨站请求伪造
一、django操作session
一、session的设置
request.session["username"] = "smart"
request.session["age"] = 18
request.session.set_expiry(7*24*3600) # 设置session过期时间为一周后
二、获取session
username = request.session["username"]
age = request.session.get("age", "")
三、删除session
# 清除所有session
request.session.clear() # 只删除session中值得部分
# 删除所有session
# request.session.flush() # 删除session中的整条记录
# 删除key为age的session
del request.session["age"]
四、session的特点
五、session生成过程解析
"""
服务端保存用户相关状态信息 返回给客户端随机字符串
针对保存 django需要一张表来处理 >>> 自带的django_session表
ps:django数据库迁移命令会产生一堆默认的表 其中就有一张django_session表
"""
1.设置session内部发生的事情
1.产生一个随机字符串
2.表中存储随机字符串与加密数据的对应关系
3.并将产生的随机字符串也给客户端发送一份并让其保存
sessionid:随机字符串
2.获取session内部发送的事情
1.自动获取客户端请求中的随机字符串
2.自动去存储session数据的表中比对
3.如果比对成功自动获取并'解密处理'
六、知识点补充
session的过期时间设置
`session`的有效期时间是通过`request.session.set_expiry(value)`进行设置的。
1. 如果`value`是一个`int`类型,那么`session`将在`value`这个时间后过期,其中`value`代表的是秒。
2. 如果`value`是一个`datetime`或者`timedelta`对象,那么这个`session`将在指定的时间后过期。`datetime`必须是使用了`PickleSerializer`进行序列化的。
3. 如果`value`等于`0`,那么`session`将在web浏览器关闭后就直接过期。
4. 如果`value`等于None,那么`session`将用`settings.py`中设置的全局过期字段`SESSION_COOKIE_AGE`,这个字段默认是14天,也就是2个礼拜。
5. 读`session`的时候不会修改`session`的有效期,修改`session`的时候会重新设置`session`的有效期,会从修改的时间,重新计时。
6. 如果`settings.py`中设置了`SESSION_EXPIRE_AT_BROWSER_CLOSE=True`,那么默认讲不再使用`SESSION_COOKIE_AGE`了,而是浏览器一关闭,`session`数据就会过期。这个值默认是为`False`。
7. 判断是否在session里面:
"username" in request.session
8. 获取所有session的key和value
request.session.keys()
request.session.values()
request.session.items()
9.针对session数据的存储位置 有五种方案
1.数据库存储
2.缓存存储
3.文件存储
4.缓存+数据库存储
5.动态加密
二、CBV添加装饰器的三种方式
-
需要借助于一个专门的装饰器模块
from django.utils.decorators import method_decorator
方式1:直接在类中的某个方法上添加
class MyLoginView(views.View):
@method_decorator(login_auth)
def get(self, request):
return HttpResponse("from CBV get view")
方式2:直接在类名上添加并指定
@method_decorator(login_auth, name='get')
class MyLoginView(views.View):
def get(self, request):
return HttpResponse("from CBV get view")
方式3:重写dispatch方法并添加作用于类中所有的方法
class MyLoginView(views.View):
@method_decorator(login_auth)
def dispatch(self, request, *args, **kwargs):
super().dispatch(request,*args,**kwargs)
三、django中间件
django中间件简介
Django 中间件是修改 Django request 或者 response 对象的钩子,可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程。
浏览器从请求到响应的过程中,Django 需要通过很多中间件来处理,可以看如下图所示:
Django 中间件作用:
- 修改请求,即传送到 view 中的 HttpRequest 对象。
- 修改响应,即 view 返回的 HttpResponse 对象。
中间件组件配置在 settings.py 文件的 MIDDLEWARE 选项列表中。
配置中的每个字符串选项都是一个类,也就是一个中间件。
Django 默认的中间件配置:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
django中间件五个常见方法
django不单有七个中间件并且每个都有很多功能和方法,除此之外django还支持自定义中间件并提供五个可以自定义的方法
- process_request
- process_response
- process_view
- process_template_response
- process_excepton
django中间件的使用场景:只要是全局相关的功能都可以在中间件中编写
eg:用户黑名单校验、用户访问频率校验、网站全局用户身份校验
自定义中间件
过程
- 创建一个任意名称的文件夹
- 在该文件夹内创建一个任意名称的py文件
- 在该py文件内编写中间件类
- 配置文件中注册
必须要掌握的方法
1. process_request
请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法 如果没有则直接跳过
如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据
2. process_response
响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法 如果没有则直接跳过
如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据 而不再是视图函数想要返回给客户端的数据
如果process_request返回了HttpResponse对象 那么会从当前位置从下往上执行每一个process_response
需要了解的方法
-
process_view
路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法
-
process_template_response
视图函数执行完毕之后返回的对象中含有render属性对应一个render方法
则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法 -
process_exception
视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception
四、csrf跨站请求伪造
CSRF的定义
CSRF(Cross-site request forgery)跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
CSRF的分类
- HTML CSRF攻击
- JSON HiJacking攻击
- Flash CSRF攻击
CSRF的攻击过程
- 假设用户A登录银行的网站进行操作,同时也访问了攻击者预先设置好的网站。
- 用户A点击了攻击者网站的某一个链接,这个链接是http://www.bank.com/xxx指向银行,银行服务器根据这个链接携带的参数会进行转账操作。
- 银行服务器在执行转账操作之前会进行Session验证,但是由于用户A已经登录了银行网站,攻击者的链接也是www.bank.com,所以攻击的链接就会携带session到服务器。
- 由于session id是正确的,所以银行会判断操作是由本人发起的,执行转账操作。
CSRF的攻击条件
- 登录受信任网站A,生成可信的Session
- 在不登出A的情况下,访问危险网站B,网站B伪造网站A的请求
Django提供的解决策略
针对csrf相关的校验有很多种方式 django只是提供了一些而已
- form表单
<form action="" method="post">
{% csrf_token %}
<p>当前账户:<input type="text" name="current_user"></p>
<p>目标账户:<input type="text" name="target_user"></p>
<p>转账金额:<input type="text" name="money"></p>
<input type="submit">
</form>
- ajax请求
方式1:
页面任意位置先写{% csrf_token %} 之后获取数据
'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()
方式2:模板语法直接获取
'csrfmiddlewaretoken':{{ csrf_token }}
补充:
通用解决方案:js脚本自动处理
也只能适用于ajax提交 form表单还是需要额外指定