csrf跨站请求伪造
# 1.简介
钓鱼网站:假设是一个跟银行一模一样的网址页面 用户在该页面上转账
账户的钱会减少 但是受益人却不是自己想要转账的那个人
# 2.模拟
一台计算机上两个服务端不同端口启动 钓鱼网站提交地址改为正规网站的地址
# 3.预防
csrf策略:通过在返回的页面上添加独一无二的标识信息从而区分正规网站和钓鱼网站的请求
csrf操作
# 1.如何防止钓鱼网站的操作
- 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,但是局部视图函数不需要校验,如何处理。
# 3.FBV
- 1.导入模块
from django.views.decorators.csrf import csrf_protect,csrf_exempt
# csrf_protect(校验csrf),csrf_exempt(不校验csrf)
- 2.添加语法糖
@csrf_exempt/@csrf_protect
def home(request):
return HttpResponse('嗨嗨嗨')
# 4.CBV
- 1.CBV不能直接在方法上添加装饰器,需要借助于专门添加装饰器的方法
方式1:在类的装饰器上指名道姓的添加
@method_decorator(csrf_protect, name='post')
class MyHome(view.view):
方式2:装饰器会对所有的类产生效果
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
super(MyHome, self).dispatch(request, *args, **kwargs)
方式3:指明道姓的添加
@method_decorator(csrf_protect)
def post(self, request):
return HttpResponse('Home Post view')
"""如果不校验csrf只有方式3有效,对于其他装饰器上述三种方式都有效"""
auth认证模块及操作
# 1.django执行数据库迁移命令之后会产生一个auth_user表
- 该表可以配合auth模块做用户相关的功能:注册 登录 修改密码 注销
- 该表还是django admin后台管理默认的表
django admin后台管理员账号创建
python manage.py createsuperuser
# 2.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.校验用户登录装饰器
from django.contrib.auth.decorators import login_required
# 跳转局部配置
login_required(login_url='/login/')
# 跳转全局配置
LOGIN_URL = '/login/'
- 7.校验密码是否正确
request.user.check_password(old_password)
- 8.修改密码
request.user.set_password(new_passowrd)
request.user.save()
- 9.注销登录
auth.logout(request)
扩展auth_user表
# 1.models.py
from django.contrib.auth.models import AbstractUser
class Userinfo(AbstractUser):
'''扩展auth_user表中没有的字段'''
phone = models.BigIntegerField()
desc = models.TextField()
# 2.settings.py
AUTH_USER_MODEL = 'app01.Userinfo'
基于django中间件设计项目功能
导入模块的方式
1.import ...
2.from ... import ...
3.通过字符串,把其设置为配置文件
"""
1.简单的函数式封装
2.配置文件插拔式设计
"""