Django学习笔记(4)

为什么80%的码农都做不了架构师?>>>   hot3.png

首先提一个问题:在Django中如何处理CRSF(Cross-site request forgery)?

先看一下CSRF原理。

输入图片说明

其实就是恶意网站利用正常网站的cookie去非法请求。

##Java处理方式##

一般做法需要后台和前端配合采取策略去防止CRSF。

1 前端页面请求后台CGI的时候带上一个参数tk,这个tk是将cookie经过time33算法签名算得的一个参数。

假设cookie为"thiscookie",tk=time33("thiscookie")=fg2hgasdf;

这样在CGI上添加tk=fg2hgasdf,当然请求时还会带上"thiscookie"。所以GET请求可能是这样的

my.oschina.net/anti-csrf?name=huangyi&tk=fg2hgasdf

在Request Headers中有一个Cookie:cookie="thiscookie"

三方网站是无法获取cookie计算这个tk签名的。

2 后台程序在request中获取到cookie,也经过time33算法签名,即token=time33("thiscookie") 。然后与url中带过来的tk进行比较,如果token==tk,则认为是正常的请求。这一步通常是写在拦截器中的。

Django解决方法

Django自带CRSF的解决方法

Thankfully, you don’t have to worry too hard, because Django comes with a very easy-to-use system for protecting against it. In short, all POST forms that are targeted at internal URLs should use the {% csrf_token %} template tag。

  1. django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 客户端的cookie 里。

  2. 客户端提交所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag {% csrf_token %}, django 就会自动生成),每次POST请求也会带上1中的cookie。

  3. 服务器端在处理 POST 请求之前,Django 会验证这个请求cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求。

  4. 在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

前端页面

<h1>{{ question.question_text }}</h1>{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" /><label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="submit to Vote" />
</form>

只需要在表单中加入{% csrf_token %}即可,作用是生成表单的csrfmiddlewaretoken字段。

输入图片说明

在请求的头中可以看见Cookie有两个元素

Cookie:sessionid=fg2xeknnq2f37a0yvz9rpmmmu78lk4vi; 
csrftoken=aFuwdo1WRnnwN9KlWK4oVZF1PO6DtDFG

表单FormData中含有一个 csrfmiddlewaretoken 字段。

后台服务主要是验证cookie中的csrftoken与csrfmiddlewaretoken字段是否相等,在CsrfViewMiddleware中实现。

同时对应{% csrf_token %}模板写法,需要在views函数中加入

from django.shortcuts import render_to_response
from django.template.context_processors import csrfdef my_view(request):c = {}c.update(csrf(request))# ... view code herereturn render_to_response("a_template.html", c)

##参考

https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/

https://docs.djangoproject.com/en/1.8/ref/csrf/

转载于:https://my.oschina.net/lvyi/blog/504509

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL复制--slave设置读取binlog的位置

change_master->global_init_info->Master_info::mi_init_info->Rpl_info_handler::init_info->Rpl_info_file::do_init_info ->mi->rli->rli_init_info()->初始化./relay-bin.000001,4如果relay-log.info不存在的话&#xff0c;否则读取//初始化mas…

【遥感数字图像处理】实验:遥感专题地图制作经典流程(Erdas版)

实验目的:掌握计算机辅助下遥感专题地图的制作。实验平台:ERDAS 9.1实验要求:掌握专题地图的编辑;制图文件路径的编辑;系列地图编辑工具的使用。实验步骤:1 专题地图的编辑 1.1 准备专题制图数据 (1) 在视窗菜单条中点击 File,选择Open (2) 点击 Raster Layer,打开S…

.NET版OCR紧随PP-OCRv3重磅发布

.net版OCR地址PaddleOCRSharp&#xff1a;https://gitee.com/raoyutian/paddle-ocrsharpPaddleOCRSharp是一个基于PaddleOCR的C代码修改并封装的.NET的工具类库。包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能&#xff0c;同时针对小图识别不准的情况下&a…

mysql导出二进制日志_使用mysqlbinlog提取二进制日志

MySQL binlog日志记录了MySQL数据库从启用日志以来所有对当前数据库的变更。binlog日志属于二进制文件&#xff0c;我们可以从binlog提取出来生成可阅读的SQL语句来重建当前数据库以及根据需要实现时点恢复或不完全恢复。本文主要描述了如果提取binlog日志&#xff0c;并给出相…

《零基础看得懂的C++入门教程 》——(5) 容我套个娃 循环

一、学习目标 了解循环的使用方法 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;C与C使用的软件是一样的&#xff0c;查看这篇即可&#xff1a;《软件介绍》 想了解编译原理和学习方法点这篇&#xff0c;学习方法和一些原理C与C都是相同的《脱离学习误区》 …

Android之把app作为独立的module导入其他项目遇到的坑

1 问题 把app作为独立的module导入其他项目 2 步骤 1)在app的里面的build.gradle里面把 apply plugin: com.android.application 替换成如下 apply plugin: com.android.library 2)注视掉build.gradle文件里面的applicationId 3)app的AndroidManifest文件中MainActiv…

【ArcGIS风暴】ArcGIS解决数字化之前创建图层时未定义坐标系而导致数据跑偏的问题

数字化时,第一步需要创建点线面图层,创建图层需要指定一个地理坐标系,但如果忽略了这一步,我们数字化的适量数据时没有坐标系的,后果很严重,如果数字化工作只做了一点点,可以卷土重来;如果是大量工作的话,可以采取以下补救措施,建议收藏。 注: (1)如果底图为无任…

Android两个注意事项.深入了解Intent和IntentFilter(两)

深入理解Intent和IntentFiler(二)转载请表明出处&#xff1a;http://blog.csdn.net/u012637501(嵌入式_小J的天空) 在上一篇文章中&#xff0c;我们比較具体学习了"Intent"的相关知识&#xff0c;如今将学习怎样设置Intent对象的这些属性以及怎样使用他们来启动组件。…

Oracle常用sql语句(一)

Sql的分类DDL操作数据库表列等表基本的操作主键索引视图 常用数据类型字符串类型数字类型日期类型LOB类型LONG类型 数据转换character datenumbercharacter通用函数条件表达式Sql的分类 DDL &#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言&#xf…

ASP.NET Web API 实现客户端Basic(基本)认证 之简单实现

优点是逻辑简单明了、设置简单。 缺点显而易见&#xff0c;即使是BASE64后也是可见的明文&#xff0c;很容易被破解、非法利用&#xff0c;使用HTTPS是一个解决方案。 还有就是HTTP是无状态的&#xff0c;同一客户端每次都需要验证。 实现&#xff1a; 客户端在用户输入用户名及…

WPF|分享一个登录界面设计

分享一个登录界面&#xff0c;先看效果图&#xff1a;准备文中使用到了一些图标&#xff1a;我们可以从 iconfont[1]免费下载&#xff1a;代码简单说明请随手创建一个WPF项目&#xff08;.NET Framework、.NET 5\6\7皆可&#xff09;&#xff0c;使用tree /f命令看看最终的文件…

《零基础看得懂的C++入门教程 》——(6)自己动手写个函数

一、学习目标 了解C语言的自定义函数的使用方法了解C语言自定义函数的传参了解C语言自定义函数的返回值 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;C与C使用的软件是一样的&#xff0c;查看这篇即可&#xff1a;《软件介绍》 想了解编译原理和学习方法点…

k8s mysql数据同步_K8s——MySQL实现数据持久化

1、搭建nfs存储[rootdocker-k8s01 ~]# yum -y install nfs-utils[rootdocker-k8s01 ~]# mkdir /nfsdata/mysql -p[rootdocker-k8s01 ~]# cat /etc/exports/nfsdata *(rw,sync,no_root_squash)[rootdocker-k8s01 ~]# systemctl restart nfs-server[rootdocker-k8s01 ~]# systemc…

【计算机图形学】实验:C#语言采用GDI+定义笔刷并填充图形完整实验操作流程

一、实验目的: 熟练掌握在.net环境下对笔刷的定义,并可用定义好的笔刷填充多边形。 二、实验准备: 学习在.net环境下GDI+所提供的5种笔刷类型,掌握定义笔刷的方法和填充图形的函数,如FillRectange ( )、FillEllipse ( )等。 三、实验内容: 在.net环境中设计一个窗体…

Android之提示Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed

1 问题 02-28 22:44:33.031 7379 7379 E AndroidRuntime: java.lang.IllegalArgumentException: Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed 02-28 22:44:33.031 7379 7379 E AndroidRuntime: at android.graphics.Canvas.checkValidClipOp(C…

使用Java API的5个技巧

本文介绍了一些关于Java API安全和性能方面的简单易用的技巧&#xff0c;其中包括保证API Key安全和开发Web Service方面中在框架方面选择的一些建议。 程序员都喜欢使用API&#xff01;例如为app应用构建API或作为微服务架构体系的一部分。当然&#xff0c;使用API的前提是能让…

管道模式 pipe

先放一个图&#xff0c;预则立嘛 PipelinePattern.rar 这里是 不完整的码转载于:https://www.cnblogs.com/ganmk--jy/p/5525897.html

《零基础看得懂的C++入门教程 》——(7)小数组玩起来

一、学习目标 了解数组的使用方法了解一维数组的使用方法了解一维数组与循环的使用方法 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;C与C使用的软件是一样的&#xff0c;查看这篇即可&#xff1a;《软件介绍》 想了解编译原理和学习方法点这篇&#xff0c…

SSO 方案演进

1背景介绍 随着业务与技术的发展&#xff0c;现今比以往任何时候都更需要单点登录 SSO 身份验证。现在几乎每个网站都需要某种形式的身份验证才能访问其功能和内容。随着网站和服务数量的增加&#xff0c;集中登录系统已成为一种必要。在本文中&#xff0c;我们将讨论下 …

【计算机图形学】实验:VB.net环境下的图形裁剪完整实验操作流程

一、实验目的: 熟练掌握在.net环境下对图形的裁剪。 二、实验准备: 学习图形裁剪的基本算法,以及在.net环境下裁剪图形的基本方法。 三、实验内容: 在.net环境中利用裁剪图形的基本方法对任意图形进行裁剪。