学习笔记,仅供参考,有错必纠


文章目录

  • 中间件Middleware
    • 跨站请求伪造
      • 防护方案
      • 举个例子

中间件Middleware

跨站请求伪造

  • 跨站请求伪造攻击

某些恶意网站上包含链接、表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息,试图在我们的网站上完成某些操作,这就是跨站请求伪造

  • CSRF
Cross-Site Request Forgey
跨     站点   请求    伪装

CSRF中间件模板标签提供了对跨站请求伪造的简单防护,它可以防止其它表单提交到我们的Django 服务器中。

防护方案

  • 取消 csrf 验证(不推荐)

删除(注释)settings.py文件中的MIDDLEWARE列表里的 django.middleware.csrf.CsrfViewMiddleware 的中间件。

  • 开放验证

在视图处理函数增加@csrf_protect装饰器

@csrf_protect
def post_views(request):pass
  • 通过验证(最常用)

在我们的表单中添加一个标签

{% csrf_token %}

举个例子

我们先打开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',
#    'mymiddleware.checklogin.MyMiddleWare',
#    'mymiddleware.checklogin.VisitLimit',
]

我们向登录界面http://127.0.0.1:8000/userinfo/login/发起请求,并进行登录操作,点击登录后,网页产生了403错误(没有请求权限):

它提示我们CSRF token丢失或不正确。

现在,为了能够成功提交数据,我们需要在提交表单的模板中增加一个标识符:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登陆</title>
</head>
<body>
<form action="/userinfo/login/" method="POST">{% csrf_token %}<div><lable>用户名</lable><input type="text" name="username"value="{{ username }}"></div><div><lable>密码</lable><input type="password" name="password"></div><div><lable for="id_remember">记住密码</lable><input type="checkbox" name="remember" id="id_remember"value="1"></div><div><input type="submit" value="登陆"></div></form></body>
</html>

现在,我们再次对登录界面http://127.0.0.1:8000/userinfo/login/发起请求,并进行登录:

可以看到,我们正常登录了。

我们查看一下登录界面的网页源代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登陆</title>
</head>
<body>
<form action="/userinfo/login/" method="POST"><input type="hidden" name="csrfmiddlewaretoken" value="7azE5TZgsdRF6BqkN9jlfBZgtJOx0fvQhdBZETEEo2DATMStYJoY6GY8vWSQi9Pp"><div><lable>用户名</lable><input type="text" name="username"value=""></div><div><lable>密码</lable><input type="password" name="password"></div><div><lable for="id_remember">记住密码</lable><input type="checkbox" name="remember" id="id_remember"value="1"></div><div><input type="submit" value="登陆"></div></form></body>
</html>

我们发现CSRF token标签自动生成了一个input标记:

<input type="hidden" name="csrfmiddlewaretoken" value="7azE5TZgsdRF6BqkN9jlfBZgtJOx0fvQhdBZETEEo2DATMStYJoY6GY8vWSQi9Pp">

value参数后的字符串是Django服务器提供给我们的密钥。如果提交的表单中没有带这串密钥,或者提供的密钥和Django给我们的不一致,则不会提交成功,这就起到了防护作用,防止其他网站恶意提交给我们数据。

  • 友情提示

当我们在settings.py中设置了CSRF中间件,并在form表单中增加了CSRF token标签。那么,如果不是我们服务器发布的表单,而是其他网站发布的表单向我们提交数据,那么将不会提交成功。

Django(part42)--跨站请求伪造相关推荐

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

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

  2. Django框架之跨站请求伪造

    跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF, 是一种挟制用户在 ...

  3. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

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

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  5. csrf跨站请求伪造,CBV添加装饰器,auth认证模块,基于django中间件设计项目功能

    文章目录 csrf跨站请求伪造 csrf的定义 csrf的分类 csrf的攻击过程 csrf的攻击条件 举例说明 Django提供的解决策略 csrf相关装饰器 FBV CBV 方法一(直接在类中的某 ...

  6. Django之CSRF跨站请求伪造(老掉牙的钓鱼网站模拟)

    首先这是一个测试的代码 请先在setting页面进行下面操作 注释完成后,开始模拟钓鱼网站的跨站请求伪造操作: 前端代码: <!DOCTYPE html> <html lang=&q ...

  7. (22)Ajax的基本使用(实现登录功能和局部刷新以及防止跨站请求伪造攻击)

    Ajax的作用 前后端分离的项目,需要交互,就要通过Ajax来完成交互 AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和X ...

  8. django16: csrf跨站请求伪造/CSRF相关装饰器

    CSRF 即跨站请求攻击 跨站请求伪造csrf钓鱼网站本质搭建一个跟正常网站一模一样的页面用户在该页面上完成转账功能转账的请求确实是朝着正常网站的服务端提交唯一不同的在于收款账户人不同给用户书写for ...

  9. 8中间件,csrf跨站请求伪造,auth模块

    昨日内容回顾  多对多三种创建方式   1.全自动    完全依赖于ManyToMany让django orm自动创建第三张表    优势:不需要你创建第三张表  自动创建    不足:第三张表扩展性 ...

最新文章

  1. R语言ggplot2可视化绘制分组水平条形图并在条形图的各种位置添加数值标签实战
  2. 陈鑫136201010502
  3. 蓝色三角_梅山!长三角唯一近海蓝色海湾成网红打卡地
  4. Algs4-1.4.8计算输入文件中相等的整数对的数量
  5. Jackson 注解 -- 使用构造器
  6. JSON serializing and deserializing using JSON.NET
  7. maven 配置环境变量
  8. java中JSON转含泛型对象
  9. 各种loading加载中gif图标
  10. Subsonic使用
  11. 机器学习——神经网络
  12. 如何创建一个vue项目(详细步骤)
  13. 2021年ARINC818数字视频传输重磅新品–Helios
  14. dedecms flag标签属性
  15. mall-accounts.json ES测试数据
  16. Jquery获取input file的base64码
  17. 个人版整理APP测试流程
  18. 【最短路算法】第二弹:一文弄懂Bellman-Ford(贝尔曼福特算法)
  19. Java核心编程随笔
  20. matlab高斯型隶属函数,图高斯型隶属函数.PPT

热门文章

  1. 2.5 矩阵乘法规则
  2. 医院计算机操作权限管理制度,附五医院网络工作站管理制度
  3. 移动端cube界面设计html,滴滴 Web 移动端组件库 cube-ui 开源
  4. Java中的ThreadLocal的使用--学习笔记
  5. Service Mesh服务网格:是什么和为什么
  6. kudu 存储引擎简析
  7. 1月24日学习内容整理:Django的admin组件源码分析及流程
  8. Docker技术快速精通指南
  9. 真机运行报错:Could not change executable permissions on the application
  10. 如何通过httpd和DVD ISO在RHEL上配置yum本地源