博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django学习笔记(4)
阅读量:5855 次
发布时间:2019-06-19

本文共 2035 字,大约阅读时间需要 6 分钟。

  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 的值

前端页面

{
{ question.question_text }}

{% if error_message %}

{

{ error_message }}

{% endif %}
{% csrf_token %}{% for choice in question.choice_set.all %}
{% endfor %}

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

输入图片说明

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

Cookie:sessionid=fg2xeknnq2f37a0yvz9rpmmmu78lk4vi; csrftoken=aFuwdo1WRnnwN9KlWK4oVZF1PO6DtDFG

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

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

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

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

##参考

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

你可能感兴趣的文章
中国软件产业培训网的SQL独到见解
查看>>
Service的生命周期
查看>>
卸载安全包袱,打造安全桌面虚拟平台
查看>>
网卡速率变化导致paramiko模块timeout的失效,多线程超时控制解决办法。
查看>>
中小企业web集群方案 haproxy+varnish+LNMP+memcached配置
查看>>
MYSQL数据库常用架构设计
查看>>
Python面向对象基础
查看>>
python11.12
查看>>
OpenGL 坐标系定义
查看>>
Jumbo Frame
查看>>
我的友情链接
查看>>
jdk线程池主要原理
查看>>
进程间通信之管道
查看>>
js判断checkbox是否选中
查看>>
8.02 计算两个日期之间的天数
查看>>
使用select遇到的坑
查看>>
织梦dedecms自定义搜索可以按照附加表字段进行搜索
查看>>
SPOJ DQUERY D-query (在线主席树/ 离线树状数组)
查看>>
python 3.6 setup
查看>>
第9章 泛型
查看>>