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

看不見的法師
发布: 2025-08-01 08:10:32
原创
917人浏览过
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运行复制
<code class="javascript">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('发帖失败')</code>
登录后复制

2)打开assetinfo/urls.py文件,配置url

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">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),]</code>
登录后复制

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

login.html

代码语言:javascript代码运行次数:0运行复制
<code class="javascript"><!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></code>
登录后复制

post.html

代码语言:javascript代码运行次数:0运行复制
<code class="javascript"><!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></code>
登录后复制

4)启动运行服务器。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">python3 manage.py runserver</code>
登录后复制

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运行复制
<code class="javascript"><!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></code>
登录后复制

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

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

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

AiPPT模板广场
AiPPT模板广场

AiPPT模板广场-PPT模板-word文档模板-excel表格模板

AiPPT模板广场 147
查看详情 AiPPT模板广场
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运行复制
<code class="javascript">MIDDLEWARE = (    'django.contrib.sessions.middleware.SessionMiddleware',    'django.middleware.csrf.CsrfViewMiddleware',)</code>
登录后复制

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

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

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

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">{% csrf_token %}</code>
登录后复制
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页面,而不会进行后续的处理。

以上就是31. Django 2.1.7 模板 - CSRF 跨站请求伪造的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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