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

2024-08-21 03:38

本文主要是介绍31. Django 2.1.7 模板 - CSRF 跨站请求伪造,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文献

  • https://docs.djangoproject.com/zh-hans/2.1/topics/templates/

CSRF

CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

CSRF示意图如下:

如果想防止CSRF,首先是重要的信息传递都采用POST方式而不是GET方式,接下来就说POST请求的攻击方式以及在Django中的避免。

示例

下面开启两个Django服务,来模拟一下攻击过程。

首先来构建第一个Django项目

1)打开assetinfo/views.py文件,创建视图loginlogin_check, postpost_action

def login(reqeust):return render(reqeust, '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)打开assetinfo/urls.py文件,配置url

urlpatterns = [# ex:/assetinfo/loginpath('login/', views.login),# ex:/assetinfo/login_checkpath('login_check/', views.login_check),# ex:/assetinfo/postpath('post/', views.post),# ex:/assetinfo/post_actionpath('post_action/', views.post_action),
]

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

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户登录</title>
</head>
<body>
<form method="post" action="/assetinfo/login_check/">用户名:<input type="text" name="username"/><br/>密码:<input type="password" name="password"/><br/><input type="submit" value="提交"/>
</form>
</body>
</html>

post.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>发帖页面</title>
</head>
<body>
<form method="post" action="/assetinfo/post_action/">标题:<input type="text" name="title"/><br/>内容:<textarea name="content"></textarea><input type="submit" value="发帖"/>
</form>
</body>
</html>

4)启动运行服务器。

python3 manage.py runserver

5)在浏览器中输入如下网址,将这个标签称为网站A。

http://127.0.0.1:8000/assetinfo/login/

浏览效果如下图:

输入账号、密码,登录之后,进入发帖页面,如下:

6)下面使用Django第二个项目来模拟另外一个网站,创建post.html,复制templates/assetinfo/post.html内容,并修改action路径。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>B网站模拟请求页面</title>
</head>
<body>
<form method="post" action="http://127.0.0.1:8000/assetinfo/post_action/">标题:<input type="text" name="title"/><br/>内容:<textarea name="content"></textarea><input type="submit" value="发帖"/>
</form>
</body>
</html>

7)在windows中浏览器查看效果如下图,将这个标签称为网站B。

8)Django项目中默认启用了csrf保护,现在先禁用,打开第一个项目中的mysite/settings.py文件,注释掉csrf中间件。

9)点击浏览器的第一个标签即网站A,点击"发帖"按钮后如下图:

10)点击浏览器的第二个标签即网站B,点击“发帖”按钮后如下图:

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

对比上面两个步骤,发现无论从网站A还是网站B都可以访问网站Apost_action视图,这就是不安全的。

防止CSRF

1)Django提供了csrf中间件用于防止CSRF攻击,只需要在网站Amysite/settings.py中启用csrf中间件即可。

要注意,Django 2 开始开启中间件不是默认生产的MIDDLEWARE_CLASSES中编写,需要写到MIDDLEWARE中,如下:

MIDDLEWARE = ('django.contrib.sessions.middleware.SessionMiddleware','django.middleware.csrf.CsrfViewMiddleware',
)

2)回到windows浏览器中,分别在网站A、网站B中点击“提交”按钮,效果一样,如下图:

3)这下麻烦了,因为网站A自己也不能访问了,接下来templates/assetinfo/post.html内容,在form表单中使用标签csrf_token。

{% csrf_token %}

4)回到windows浏览器中,在网站A中点击“提交”按钮,效果如下图:

5)回到windows浏览器中,在网站B中点击“提交”按钮,效果如下图:

好了,Django中成功完成CSRF防护。

总结

  • 重要信息如金额、积分等,采用POST方式传递

  • 启用CSRF中间件,默认启用

  • 在form表单中post提交时加入标签csrf_token

保护原理

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

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

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

这篇关于31. Django 2.1.7 模板 - CSRF 跨站请求伪造的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092012

相关文章

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

对Django中时区的解读

《对Django中时区的解读》:本文主要介绍对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景前端数据库中存储接口返回AI的解释问题:这样设置的作用答案获取当前时间(自动带时区)转换为北京时间显示总结背景设置时区为北京时间 TIM

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置