0

0

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

看不見的法師

看不見的法師

发布时间:2025-08-01 08:10:32

|

919人浏览过

|

来源于php中文网

原创

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

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

CSRF示意图如下:

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

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

示例

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

首先来构建第一个Django项目

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

代码语言:javascript代码运行次数:0运行复制
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

代码语言:javascript代码运行次数:0运行复制
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

代码语言:javascript代码运行次数:0运行复制
        用户登录
用户名:
密码:

post.html

代码语言:javascript代码运行次数:0运行复制
        发帖页面
标题:
内容:

4)启动运行服务器。

代码语言:javascript代码运行次数:0运行复制
python3 manage.py runserver

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

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

浏览效果如下图:

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

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

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

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

代码语言:javascript代码运行次数:0运行复制
        B网站模拟请求页面
标题:
内容:

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

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

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

WHEE
WHEE

WHEE是一款AI绘画与图片生成器,提供一站式AI视觉创作服务。WHEE不仅会画也会修图,各种AI修图功能一应俱全。

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

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

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

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

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

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

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

防止CSRF

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

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

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

代码语言:javascript代码运行次数:0运行复制
MIDDLEWARE = (    'django.contrib.sessions.middleware.SessionMiddleware',    'django.middleware.csrf.CsrfViewMiddleware',)

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

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

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

代码语言:javascript代码运行次数:0运行复制
{% csrf_token %}
31. Django 2.1.7 模板 - CSRF 跨站请求伪造

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

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

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

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

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

总结重要信息如金额、积分等,采用POST方式传递启用CSRF中间件,默认启用在form表单中post提交时加入标签csrf_token保护原理

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

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

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

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

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

178

2024.05.11

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

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

217

2025.12.18

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6430

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

415

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

95

2025.08.19

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.11.24

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

834

2023.07.26

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

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

精品课程

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

共28课时 | 3.7万人学习

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号