csrf跨站请求网站

什么是csrf跨站请求网站

简单的来说就是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作,由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行

经典例子-钓鱼网站

钓鱼网站:假设是一个跟银行一模一样的网站页面,用户在该页面上转账
账户的钱会减少,但是受益人却不是自己想要转账的那个人

模拟

一台计算机上俩个服务端不同端口启动,钓鱼网站提交地址改为正规网站的地址

真正网站的代码

前端:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h2>这是真正的网站</h2>
<form action="" method="post">
<p>username:
<input type="text" name="username">
</p>
<p>target_user:
<input type="text" name="target_user">
</p>
<p>money:
<input type="text" name="money">
</p>
<input type="submit">
</form>
</body>
</html> 后端:
from django.shortcuts import render # Create your views here.
def transfer(request):
if request.method == 'POST':
username = request.POST.get('username')
target_user = request.POST.get('target_user')
money = request.POST.get('money')
print(f'{username}给{target_user}转了{money}')
return render(request, 'transfer.html') 路由:
from django.contrib import admin
from django.urls import path
from app01 import views urlpatterns = [
path('admin/', admin.site.urls),
path('transfer/', views.transfer),
]

钓鱼网站的代码

前端:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h2>这是钓鱼网站</h2>
<form action="http://127.0.0.1:8000/transfer/" method="post">
<p>username:
<input type="text" name="username">
</p>
<p>target_user:
<input type="text">
<input type="text" name="target_user" value="小笨蛋" style="display: none"> </p>
<p>money:
<input type="text" name="money">
</p>
<input type="submit">
</form>
</body>
</html> 后端:
from django.shortcuts import render # Create your views here.
def transfer(request):
if request.method == 'POST':
username = request.POST.get('username')
target_user = request.POST.get('target_user')
money = request.POST.get('money')
print(f'{username}给{target_user}转了{money}')
return render(request, 'transfer.html') 路由:
from django.contrib import admin
from django.urls import path
from app01 import views urlpatterns = [
path('admin/', admin.site.urls),
path('transfer/', views.transfer),
]

钓鱼网站的实现效果

如何避免这种现象(预防)



csrf策略:通过在返回的页面上添加独一无二的标识信息从而区分正规网站和钓鱼网站的请求

如何在django中解决这个问题

form表单

<form action="" method="post">
{% csrf_token %}
</form>

ajax

方式1:先编写csrf模板语法 然后利用标签查找和值获取 手动添加
'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()
方式2:直接利用模板语法即可
'csrfmiddlewaretoken':'{{ csrf_token }}'
方式3:通用方式(js脚本)
兼容性最好,扩展性最高,前后端分离
方式3的js代码,直接copy就可以
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);
}
}
});

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

针对CBV不能直接在方法上添加装饰器 需要借助于专门添加装饰器的方法

from django.utils.decorators import method_decorator

# @method_decorator(csrf_protect, name='post')  # 方式2:指名道姓的添加
class MyHome(views.View):
@method_decorator(csrf_protect) # 方式3:影响类中所有的方法
def dispatch(self, request, *args, **kwargs):
super(MyHome, self).dispatch(request, *args, **kwargs)
'''
当路由匹配成功之后,才会执行dispatch方法,然后它会去找视图函数,所以给dispatch装上就·相当于给所有的方法都装上了装饰器
'''
def get(self, request):
return HttpResponse('Home Get view') # @method_decorator(csrf_protect) # 方式1:指名道姓的添加
def post(self, request):
return HttpResponse('Home Post view')
针对csrf_exempt只有方式3有效 针对其他装饰器上述三种方式都有效

auth认证模块

auth模块模块是什么

Auth模块是Django自带的用户认证模块

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统,django执行数据库迁移命令之后会产生一个auth_user表,该表可以配合auth模块做用户相关的功能:注册 登录 修改密码 注销 ...,该表还是django admin后台管理默认的表

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点,它内置了强大的用户认证系统———Auth模块

使用admin后台管理

创建了超级管理员

管理员登录成功

这个管理员功能是非常强大的,可以直接对表进行增删改查、修改数据等,并且页面也挺好看

增加表中数据

Auth模块方法编写登录、注册功能

auth.authenticate(request, username=username, password=password)返回的是一个对象

# res = auth.authenticate(request, username=username, password=password)
# print(res)
# print(res.username) # jason
# print(res.password) # pbkdf2_sha256$150000$wymiPvzXEUIH$vn6XTMN/YWwiGa98WScB/Hs5MfPtB5br+JCM3oWBtwk=
# print(res.pk) # 2
is_user_obj = auth.authenticate(request, username=username, password=password)
"""
数据存在的时候返回的是一个数据对象
数据不存在的时候返回的是一个None
"""

用户登录时候与用户没有登录(request.user)

print(request.user)
"""
当用户登录成功之后(执行了auth.login) 该方法返回当前登录用户对象(admin)
当用户没有登录成功(没有执行了auth.login) 该方法返回匿名用户对象(AnonymousUser)
"""

判断当前用户是否登录 (request.user.is_authenticated)

校验用户是否登录

导入模块

from django.contrib import auth

from django.contrib.auth.decorators import login_requilightSeagreen

局部校验

校验用户是否登录, 默认跳转登录地址比较复杂, 我们可以自定义跳转登录的地址

@login_requilightSeagreen(login_url='/login/') 它会自动跳转到login

全局校验

在settings.py中配置: LOGIN_URL = '/login/'

注册功能

def register(request):
User.objects.create_user(username='jerry', password=123) # 创建普通用户
User.objects.create(username='jerry1', password=123) # 创建普通用户,密码不能加密
return HttpResponse('注册功能')

def register(request):
User.objects.create_superuser(username='oscar', password=123, email='oscar@163.com') # 创建超级管理员
return HttpResponse('注册功能')

Auth模块常用的方法

导入Auth模块:from django.contrib import auth

1.authenticate()
校验用户名和密码是否正确
auth.authenticate(request,username,password)
2.login
用户登录
auth.login(request, user_obj)
3.is_authecticated
判断用户是否登录
request.user.is_authecticated
4.create_user、create_superuser
创建用户
User.object.contrib.auth.models import User
User.object.create_user(username, password)
User.object.create_superUser(username, password, email)
5.check_password
校验密码是否正确
request.user.check_password(old_password)
6.set_password
request.user.set_password(new_password)
request.user.save() # 必须要保存
7.logout
auth.logout(request)
8.校验用户登录装饰器
from django.contrib.auth.decorators import login_requilightSeagreen
跳转局部配置
login_requilightSeagreen(login_url='/login/')
跳转全局配置
LOGIN_URL = '/login/'
9.获取登录用户对象
request.user

auth_user表切换

我们还想使用auth模块的方法并且扩展auth_user表字段

1.models.py
from django.contrib.auth.models import AbstractUser # auth_user表序列化的一个类 class Userinfo(AbstractUser):
'''扩展auth_user表中没有的字段'''
phone = models.BigIntegerField()
desc = models.TextField()
"""
写一个类继承AbstractUser这个类,那么我写的这个类就拥有了AbstractUser这个类里面所有的字段
""" 2.settings.py
AUTH_USER_MODEL = 'app01.Userinfo'

基于django中间件设计项目功能

csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能的更多相关文章

  1. Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想

    django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...

  2. pikaqiu练习平台(CSRF(跨站请求伪造) )

    CSRF(跨站请求伪造)   CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接 ...

  3. 教你轻松解决CSRF跨站请求伪造攻击

    摘要:CSRF(Cross-site request forgery)跨站请求伪造,通过伪装来自受信任用户的请求来利用受信任的网站.与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也 ...

  4. 什么是CSRF跨站请求伪造?(from表单效验csrf-ajdax效验csrf-Ajax设置csrf-CBV装饰器验证csrf)

    目录 一:csrf跨站请求伪造 1.什么是CSRF? 2.CSRF攻击案例(钓鱼网站) 3.钓鱼网站 内部原理 4.CSRF原理(钓鱼网站内部本质) 5.从上图可以看出,要完成一次CSRF攻击,受害者 ...

  5. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  6. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  7. django上课笔记3-ORM补充-CSRF (跨站请求伪造)

    一.ORM补充 ORM操作三大难点: 正向操作反向操作连表 其它基本操作(包含F Q extra) 性能相关的操作 class UserInfo(models.Model): uid = models ...

  8. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  9. django之跨站请求伪造csrf

    目录 跨站请求伪造 csrf 钓鱼网站 模拟实现 针对form表单 ajax请求 csrf相关的两个装饰器 跨站请求伪造 csrf 钓鱼网站 就类似于你搭建了一个跟银行一模一样的web页面 , 用户在 ...

随机推荐

  1. Hdfs存储策略

    一.磁盘选择策略 1.1.介绍 在HDFS中,所有的数据都是存在各个DataNode上的.而这些DataNode上的数据都是存放于节点机器上的各个目录中的,而一般每个目录我们会对应到1个独立的盘,以便 ...

  2. 我不就是吃点肉,应该没事吧——爬取一座城市里的烤肉店数据(附完整Python爬虫代码)

    写在前面的一点屁话: 对于肉食主义者,吃肉简直幸福感爆棚!特别是烤肉,看着一块块肉慢慢变熟,听着烤盘上"滋滋"的声响,这种期待感是任何其他食物都无法带来的.如果说甜点是" ...

  3. 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容

    写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...

  4. SELECT 的6大子句

    SELECT 6大子句的顺序: SELECT selection_list /*要查询的列名称*/, 结果的字段列表 FROM table_list /*要查询的表名称*/, 后面跟表,视图,多行多列 ...

  5. RabbitMQ:消息丢失 | 消息重复 | 消息积压的原因+解决方案+网上学不到的使用心得

    前言 首先说一点,企业中最常用的实际上既不是RocketMQ,也不是Kafka,而是RabbitMQ. RocketMQ很强大,但主要是阿里推广自己的云产品而开源出来的一款消息队列,其实中小企业用Ro ...

  6. GET 请求和 POST 请求的区别和使用

    作为前端开发, HTTP 中的 POST 请求和 GET 请求是经常会用到的东西,有的人可能知道,但对其原理和如何使用并不特别清楚,那么今天来浅谈一下两者的区别与如何使用. GET请求和POST请求的 ...

  7. 4-3 Spring MVC框架-02

    Spring MVC框架-02 Ⅰ.RESTful基础 是一种设计风格和开发方式 1.get和post请求区别: get post 获取请求 上传请求 请求参数在地址栏URL 请求参数在请求体里面 U ...

  8. Solution -「简单 DP」zxy 讲课记实

    魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...

  9. Kubernetes组件介绍

    一.api-server   基本概念 该端口默认值为6443,可通过启动参数"--secure-port"的值来修改默认值. 默认IP地址为非本地(Non-Localhost)网 ...

  10. 温控器/胎压检测/电表/热泵显示控制器等,低功耗高抗干扰断/段码(字段式)LCD液晶显示驱动IC-VK2C22A/B,替代市面16C22,44*4/40*4点显示

    产品品牌:永嘉微电/VINKA 产品型号:VK2C22A/B 封装形式:LQFP52/48 产品年份:新年份 概述: VK2C22是一个点阵式存储映射的LCD驱动器,可支持最大176点(44SEGx4 ...