跨站请求伪造csrf和auth模块

こ雲淡風輕ζ 提交于 2019-12-06 15:11:27

跨站请求伪造csrf

如何设置

你只要在写form表单的时候,只要在在表单中写一个{% csrf_token %}

'''
<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>target_account:<input type="text" name="target_user"></p>
    <p>money:<input type="text" name="money"></p>
    <input type="submit">
</form>

网站在返回给用户一个form表单的时候 会自动在该表单隐藏一个input框
这个框的value是一个随机字符串 但是网站能够记住每一个浏览器发送的随机字符串
'''

ajax设置

方式一(J较为繁琐):

'''
先在页面任意的位置上书写{% csrf_token %}
然后在发送ajax请求的时候 通过标签查找获取随机字符串添加到data自定义对象即可
data:{'username':'jj',
'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},
                

'''

方式二(较为简单):

'''
data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},


'''

方式三(推荐):

'''
官网提供的文件    最通用的一种方式
                    直接兴建js文件拷贝代码 导入即可 
                    你不需要做任何的csrf相关的代码书写
                    
创建一个js文件:在static中创建js文件,                    
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

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);
    }
  }
});
前端:导入该文件
    <script src='/static/set.up.js'><\script>
    
'''

csrf相关装饰器

'''
from django.views.decorators.csrf import csrf_exempt,csrf_portect


@csrf_exempt  # 不校验 csrf
def index(request):
return HttpResponse('index')


@csrf_protect  # 校验
def login(request):
    return HttpResponse('login')
    
    
CBV中:
# @method_decorator(csrf_exempt,name='post')  # csrf_exempt不支持该方法
@method_decorator(csrf_exempt,name='dispatch')  # csrf_exempt
class MyIndex(views.View):
    # @method_decorator(csrf_exempt)  # 可以
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)
        
        
    def get(self,request):
        return render(request,'transfer.html')
        
    # @method_decorator(csrf_exempt,name='post')  # csrf_exempt不支持该方法
    def post(self,request):
        return HttpResponse('OK')       
# csrf_exempt这个装饰器只能给dispatch装才能生效
                
            
"""
csrf_protect方式全都可以  跟你普通的装饰器装饰CBV一致
"""
# @method_decorator(csrf_protect,name='post')  # 可以
class MyIndex(views.View):
    @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)
        
    def get(self,request):
        return render(request,'transfer.html')
        
    # @method_decorator(csrf_protect)  # 可以
    def post(self,request):
        return HttpResponse('OK')
        
'''

auth模块

'''
1.创建用户:
    from django.contrib.auth.models import User
    
    User.objects.create(username=username,password=password)  # 不可用  密码不是加密的
    User.objects.create_user(username=username,password=password) # 创建普通用户密码自动加密
    User.objects.create_superuser(username=username,password=password
    ,email='123@qq.com') # 创建超级用户   需要邮箱数据
    
2.校验用户名和密码是否真确  
    from django.contrib import auth
    
    user_obj=auth.authenticate(request,username=username,password=password) # 返回的是布尔值
3.保存用户登录状态
    auth.login(request,user_obj)
    只要执行了这一句话,之后你可以在任意位置,通过request.user获取到当前登录用户对象
    
4.判断当前用户是否登录
    reuqest.user.is_authenticare()
    
5.校验原来密码是否正确
    request.user.check_password(old_password)
6.修改密码
    request.user.set_password(new_password)
7.注销
    auth.logout
    
8.校验用户是否登录装饰器
    from django.contrib.auth.decorators import login_required
    局部配置
        @login_required(login_url='/login')
        def index(request):
            pass
    
    全局配置
        settings配置文件中直接配置
        LOGIN_URL='/login'
        
        @login_required
        def index(request):
            pass
    # 如果全局配置了 局部也配置  以局部的为准


'''

如何拓展auth_user表字段

方式一:

利用一对一外键字段关系
                class UserDetail(models.Model):
                     phone = models.BigIntegerField()
                     user = models.OneToOneField(to='User')

方式二:

利用继承关系  
                from django.contrib.auth.models import AbstractUser
                class Userinfo(AbstractUser):
                phone = models.BigIntegerField()
                register_time = models.DateField(auto_now_add=True)
                
                # 一定要注意 还需要去配置文件中配置
                AUTH_USER_MODEL = 'app01.Userinfo'  # 应用名.表名
                # 这么写完之后 之前所有的auth模块功能全都以你写的表为准 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!