0

0

Django 2.1.7 模板 - CSRF 跨站请求伪造

蓮花仙者

蓮花仙者

发布时间:2025-10-03 09:47:40

|

849人浏览过

|

来源于php中文网

原创

了解如何在django 2.1.7中处理csrf跨站请求伪造问题是至关重要的。本文将详细介绍django 2.1.7中关于csrf的相关内容,包括如何设置和使用csrf保护。

Django 2.1.7 模板 - CSRF 跨站请求伪造

相关篇章包括:

  • Django 2.1.7 创建应用模板
  • Django 2.1.7 配置公共静态文件、公共模板路径
  • Django 2.1.7 模板语言 - 变量、标签、过滤器、自定义过滤器、模板注释
  • Django 2.1.7 模板继承
  • Django 2.1.7 模板 - HTML转义

参考文献:https://www.php.cn/link/1844bd1b6d59ab61b41e110f72b4ef61

CSRF,即Cross Site Request Forgery(跨站请求伪造),是一种攻击者利用你的身份,以你的名义发送恶意请求的攻击方式。CSRF攻击可以导致的危害包括:以你的名义发送邮件、发消息、盗取你的账号,甚至购买商品和进行虚拟货币转账,进而可能导致个人隐私泄露和财产安全问题。

CSRF攻击示意图如下:

Django 2.1.7 模板 - CSRF 跨站请求伪造

为了防止CSRF攻击,首先应确保重要信息的传递使用POST方式而非GET方式。接下来,我们将通过在Django中模拟攻击过程来展示如何避免这种攻击。

示例:模拟CSRF攻击过程

我们将启动两个Django服务来模拟攻击过程。

  1. 构建第一个Django项目:

    打开assetinfo/views.py文件,创建视图loginlogin_checkpostpost_action

    def login(request):
        return render(request, 'assetinfo/login.html')
    

    def login_check(request): username = request.POST.get('username') # 获取用户名 password = request.POST.get('password') # 获取密码

    校验

    if username == 'smart' and password == '123':
        request.session['username'] = username # 记住登录用户名
        request.session['islogin'] = True # 判断用户是否已登录
        return redirect('/assetinfo/post/')
    else:
        return redirect('/assetinfo/login/')

    def post(request): return render(request, 'assetinfo/post.html')

    def post_action(request): if request.session['islogin']: username = request.session['username'] return HttpResponse('用户'+username+'发了一篇帖子') else: return HttpResponse('发帖失败')

  2. 配置URL:

    打开assetinfo/urls.py文件,配置URL。

    urlpatterns = [

    ex:/assetinfo/login

    path('login/', views.login),
    # ex:/assetinfo/login_check
    path('login_check/', views.login_check),
    # ex:/assetinfo/post
    path('post/', views.post),
    # ex:/assetinfo/post_action
    path('post_action/', views.post_action),

    ]

  3. 创建模板文件:

    templates/assetinfo/目录下创建login.htmlpost.html

    login.html

    
    用户登录
    用户名:

    密码:

    post.html

    
    发帖页面
    标题:

    内容:
  4. 启动服务器:

    python3 manage.py runserver
  5. 访问网站A:

    浏览器中输入https://www.php.cn/link/d3e2fe4ac9568e0b59ad61ccbc933906,登录后进入发帖页面。

    Django 2.1.7 模板 - CSRF 跨站请求伪造

    Django 2.1.7 模板 - CSRF 跨站请求伪造

  6. 模拟网站B:

    使用Django的第二个项目创建post.html,并修改action路径。

    
    B网站模拟请求页面
    标题:

    内容:

    Django 2.1.7 模板 - CSRF 跨站请求伪造

  7. 禁用CSRF保护:

    打开第一个项目的mysite/settings.py文件,注释掉CSRF中间件。

    Django 2.1.7 模板 - CSRF 跨站请求伪造

  8. 测试攻击效果:

    在网站A中点击“发帖”按钮:

    Django 2.1.7 模板 - CSRF 跨站请求伪造

    DeepAI
    DeepAI

    为天生具有创造力的人提供的AI工具

    下载

    在网站B中点击“发帖”按钮:

    Django 2.1.7 模板 - CSRF 跨站请求伪造

    Django 2.1.7 模板 - CSRF 跨站请求伪造

    通过action直接访问网站A的地址,成功执行发帖。

    发现无论从网站A还是网站B都可以访问网站A的post_action视图,这是不安全的。

防止CSRF攻击

  1. 启用CSRF中间件:

    在网站A的mysite/settings.py中启用CSRF中间件。

    Django 2.1.7 模板 - CSRF 跨站请求伪造

    注意,Django 2开始,中间件配置应在MIDDLEWARE中:

    MIDDLEWARE = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    )
  2. 测试启用CSRF中间件后的效果:

    在网站A和网站B中点击“提交”按钮:

    Django 2.1.7 模板 - CSRF 跨站请求伪造

  3. 在表单中添加CSRF令牌:

    templates/assetinfo/post.html中,添加csrf_token标签:

    {% csrf_token %}

    Django 2.1.7 模板 - CSRF 跨站请求伪造

  4. 测试网站A的效果:

    在网站A中点击“提交”按钮:

    Django 2.1.7 模板 - CSRF 跨站请求伪造

    Django 2.1.7 模板 - CSRF 跨站请求伪造

  5. 测试网站B的效果:

    在网站B中点击“提交”按钮:

    Django 2.1.7 模板 - CSRF 跨站请求伪造

    至此,成功在Django中完成CSRF防护。

总结

  • 重要信息如金额、积分等,应采用POST方式传递。
  • 启用CSRF中间件,默认情况下Django已启用。
  • 在表单中POST提交时加入csrf_token标签进行保护。

保护原理:

加入csrf_token标签后,查看post.html的源代码,会发现多了一个隐藏域:

Django 2.1.7 模板 - CSRF 跨站请求伪造

在浏览器的“开发者工具”中查看Cookie信息:

Django 2.1.7 模板 - CSRF 跨站请求伪造

启用中间件并加入csrf_token标签后,Django会向客户端浏览器写入一条Cookie信息,该信息的值与隐藏域的value属性一致。提交到服务器后,CSRF中间件会先进行验证,如果对比失败则返回403页面,而不会进行后续处理。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

176

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

212

2025.12.18

html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

603

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

643

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

465

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2876

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

503

2023.08.11

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 2.9万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 1.4万人学习

Django参考手册
Django参考手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号