标签:
一、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/
用户名或暗码错误: