csrf跨站请求伪造
- 1.简介
钓鱼网站:假设是一个跟银行一模一样的网址页面 用户在该页面上转账 账户的钱会减少 但是受益人却不是自己想要转账的那个人 - 2.模拟
一台计算机上两个服务端不同端口启动 钓鱼网站提交地址改为正规网站的地址 - 3.预防
csrf策略:通过在返回的页面上添加独一无二的标识信息从而区分正规网站和钓鱼网站的请求
csrf操作
- 如何防止钓鱼网站上面的这种操作呢?
- 1.form表单:只需要在form表单里面添加{% csrf_token %}
<form action="" method="post"> {% csrf_token %} </form>- 2.ajax
方法一: 在ajax模板内的data编写csrf模板语法,然后利用标签查找和值获取,手动添加 'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val() 方法二: 在ajax模板内的data编写csrf模板语法 'csrfmiddlewaretoken':'{{ csrf_token }}' 方法三: 通用方式(js脚本)扩展性最高 function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });
csrf相关装饰器
- 1.当整个网站默认都不校验csrf,但是局部视图函数需要校验,如何处理。
- 2.当整个网站默认都校验csrf,但是局部视图函数不需要校验,如何处理。
- FBV:
- 导入模块
from django.views.decorators.csrf import csrf_protect,csrf_exempt- csrf_protect(校验csrf)
- csrf_exempt(不校验csrf)
- 添加语法糖(校验谁给谁装)
# @csrf_protect @csrf_exempt def home(request): return HttpResponse('哈哈哈')
- 导入模块
- CBV不能直接在方法上添加装饰器,需要借助于专门添加装饰器的方法
- 方式一:在类的装饰器上指名道姓的添加
@method_decorator(csrf_protect, name='post') class MyHome(view.view): * 方式二: 装饰完会对所有的类产生效果 @method_decorator(csrf_protect) def dispatch(self, request, *args, **kwargs): super(MyHome, self).dispatch(request, *args, **kwargs) - 方式三:指明道姓添加
@method_decorator(csrf_protect) def post(self, request): return HttpResponse('Home Post view')
- 方式一:在类的装饰器上指名道姓的添加
如果不校验csrf只有方式3有效,对于其他装饰器上述三种方式都有效.
auth认证模块
- django执行数据库迁移命令之后会产生一个auth_user表
该表可以配合auth模块做用户相关的功能:注册 登录 修改密码 注销 该表还是django admin后台管理默认的表 django admin后台管理员账号创建 python manage.py createsuperuser - auth模块常见功能
- 1.用户的创建
from django.contrib.auth.models import User User.object.create_user(username,password) User.object.create_superuser(username,password,email)- 2.校验用户名密码是否正确
from django.contrib import auth auth.authenticate(request,username,password)- 3.用户登录
auth.login(request,user_obj)- 4.判断用户是否登录
request.user.is_authecticated- 5.获取登录用户
request.user- 6.校验用户登录装饰器
request.user.check_password(old_password)from django.contrib.auth.decorators import login_required 跳转局部配置 login_required(login_url='/login/') 跳转全局配置 LOGIN_URL = '/login/' * 7.校验密码是否正确request.user.set_password(new_passowrd) request.user.save()* 8.修改密码auth.logout(request)* 9.注销登录
auth_user表切换
- models.py
from django.contrib.auth.models import AbstractUser class Userinfo(AbstractUser): '''扩展auth_user表中没有的字段''' phone = models.BigIntegerField() desc = models.TextField() - settings.py
AUTH_USER_MODEL = 'app01.Userinfo'
基于django中间件设计项目功能
- 导入模块的方式
- 1.import ...
- 2.from ... import ...
- 3.通过字符串,把其设置为配置文件
1.简单的函数式封装 2.配置文件插拔式设计 ```-