当前位置:首页 > Web开发 > 正文

Django(十六)基于模板的登录案例:登录装饰器、csrf打击方法及防护、ajax的

2024-03-31 Web开发

标签:

一、csrf打击 1.1 csrf打击(跨站请求伪造)

【csrf打击即】:通过第3方网站,伪造请求(前提条件是你已经登录正常网站,并生存了session或cookie登录信息且没有退出),第三方网站即可通过你的session或cookie直接改削正常网站的用户名暗码。

技术图片

首先做一个登录页,让用户输入用户名和暗码进行登录,登录告成之后跳转的改削暗码页面。在改削暗码页面输入新暗码,点击确认按钮完成暗码改削。

登录页需要一个模板文件login.html.改削暗码页面也需要一个模板文件change_pwd.html.

显示登录页的视图login,验证登录的视图login_check,显示发帖页的视图change_pwd,措置惩罚惩罚改削暗码的视图change_pwd_action.

加成果:
a)只有用户登录之后才可以进行改削暗码操纵。

登录装饰器函数(app2/views.py):

def login_required(view_func): #参数即挪用它的函数 '''登录判断装饰器''' def wrapper(request, *view_args, **view_kwargs): # 内部函数,包装一下 # 判断用户是否登录 if request.session.has_key('islogin'): #如果登录了,就返回真正页面(挪用此装饰器函数的函数) # 用户已登录,挪用对应的视图 return view_func(request, *view_args, **view_kwargs) else: # 否则,用户未登录,则跳转到登录页 return redirect('/login') return wrapper

登录装饰器挪用,好比一个页面必需要登录才华操纵,否则跳转到登录页
【app2/views.py】@login_required

# /change_pwd @login_required #感化:把此页面作为一个参数传到login_required里 def change_pwd(request): '''显示改削暗码页面''' return render(request, 'booktest/change_pwd.html') 【csrf打击改暗码实例】(必需登录后才华操纵): 1) project2/settings.py 注释失csrf 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', ] 2)templates/change_pwd.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>改削暗码页面</title> </head> <body> <form method="post" action="/change_pwd_action/"> 新暗码:<input type="password" name="pwd"> <input type="submit" value="确认改削"> </form> </body> </html> 3) app2/views.py【登录装饰器】

【1】登录装饰器:用户已登录,挪用对应的视图;用户未登录,跳转到登录页
【2】需要登录才华操纵的页面挪用登录装饰器
【3】需要登录才华操纵的页面挪用登录装饰器

from django.shortcuts import render,redirect from django.template import loader,RequestContext from django.http import HttpResponse,JsonResponse from app2.models import BookInfo def login(request): '''登录页''' # 判断用户是否登录,用户已登录, 直接跳转到图书列表 if request.session.has_key('islogin'): return redirect('/change_pwd/') else: #如果用户名暗码已经在cookie中,则取到它,并做为参数返回给衬着页面 if 'username' in request.COOKIES: #获取cookie中的用户名、暗码 username=request.COOKIES['username'] #password=request.COOKIES['password'] else: username='' password='' return render(request,'app2/login.html',{'username':username,'password':password}) def login_check(request): '''登录校验''' #1.获取用户名暗码 username=request.POST.get('username') password=request.POST.get('password') remember=request.POST.get('remember') #接收remeber #2.进行校验,并返回json数据 if username=='jim' and password=='123': #return redirect('/books') response = JsonResponse({'res':1}) #正确返回1,重写 #如果remember==on,则把用户名,暗码设置cookie到cookie if remember=='on': #response.set_cookie('username',username,max_age=7*24*3600) #response.set_cookie('password',password,max_age=7*24*3600) # 记住用户登录状态把用户名设置到session request.session['username'] = username # 返回应答 # 如果用户勾选了remember的条件下,设置session,记住用户登录状态 request.session['islogin'] = True # 只有session中有islogin,就认为用户已登录 return response #不要忘记返回response else: #return redirect('/login') return JsonResponse({'res':0}) #错误返回0 #【1】登录装饰器:用户已登录,挪用对应的视图;用户未登录,跳转到登录页 def login_required(view_func): '''登录判断装饰器''' def wrapper(request, *view_args, **view_kwargs): # 判断用户是否登录 if request.session.has_key('islogin'): # 用户已登录,挪用对应的视图 return view_func(request, *view_args, **view_kwargs) else: # 用户未登录,跳转到登录页 return redirect('/login') return wrapper # /change_pwd @login_required #【2】需要登录才华操纵的页面挪用登录装饰器 def change_pwd(request): '''显示改削暗码页面''' # # 进行用户是否登录的判断 # if not request.session.has_key('islogin'): # # 用户未登录,跳转到登录 # return redirect('/login') return render(request, 'app2/change_pwd.html') # /change_pwd_action @login_required #【3】需要登录才华操纵的页面挪用登录装饰器 def change_pwd_action(request): '''模拟改削暗码措置惩罚惩罚''' # # 进行用户是否登录的判断 # if not request.session.has_key('islogin'): # # 用户未登录,跳转到登录 # return redirect('/login') # 1.获取新暗码 pwd = request.POST.get('pwd') # 获取用户名 username = request.session.get('username') # 2.实际开发的时候: 改削对应数据库中的内容... # 3.返回一个应答 return HttpResponse('%s改削暗码为:%s'%(username,pwd)) 4)app2/urls.py path('login/',views.login),#登录页 path('login_check',views.login_check),#登录检测 path('change_pwd/', views.change_pwd), # 改削暗码页面显示 path('change_pwd_action/', views.change_pwd_action), # 改削暗码措置惩罚惩罚 5 ) templates/login.html(ajax登录技术) <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <!-- 【0】引入jquery --> <script src=http://www.mamicode.com/"/static/js/jquery-1.12.4.min.js"></script> <title>登录页面</title> </head> <script> // 写ajax措置惩罚惩罚函数 $(function () { $('#btnLogin').click(function () { //1.获取用户名、暗码、是否记住用户名 username=$('#username').val() password=$('#password').val() remember=$('#remember').val() //【2】是否记住用户名 //2.倡议ajax--post(username,password)请求验证,地点:/login_check $.ajax({ 'url':'/login_check',//验证地点 'type':'post',//请求类型 'data':{'username':username,'password':password,'remember':remember},//【3】发送数据,加上remember 'dataType':'json',//但愿返回数据类型 }).success(function(data){ //告成返回{'res':1},掉败{'res':0} if(data.res===0){ $('#msg').show().html('用户名或暗码错误请重试!')//登录掉败则显示msg,并在里写入信息 }else{//告成跳转到books页面 location.href='/change_pwd' } }) }) }) </script> <style> /* 信息提示样式 */ #msg{ display: none; color:red; } </style> <body> <!-- 原form删除,input的name变id,便利jquery操纵 --> <!-- 【4】把views页的login()函数传过来的用户名,暗码赋值给对应处 --> 用户名:<input type="text" id="username" value="{{username}}"><br/> 暗码:<input type="password" id="password" value="{{password}}"><br/> <!-- 插手一个信息提示框,用于暗码等错误提示 --> <div id="msg"></div> <!-- 【1】记住用户名,设置cookie用,如果勾选则其value=on --> <input type="checkbox" id="remember">记住用户名<br/> <!-- 按钮type改button,加一个id便利jquery操纵 --> <input type="button" id="btnLogin" value="登录"> </body> </html> 6)效果::8000/login/ 用户名或暗码错误:

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31650.html