一般Django开发为了保障避免 csrf 的攻击,如果使用Django的模板渲染页面,那么则可以在请求中渲染设置一个csrftoken的cookie数据,但是如果需要前后端分离,不适用Django的模板渲染功能,怎么来动态获取 csrftoken 呢?

Django 通过 request 请求获取 csfttoken 的方法

from django.middleware.csrf import get_token
def getToken(request):
    token=get_token(request)
    return HttpResponse(json.dumps({'token':token}), content_type="application/json,charset=utf-8")
 

使用这种方式的确可以获取csrftoken的数据,下面来写个示例来演示一下。

Django 后端获取 csrftoken 示例

在视图 views.py 设置 getToken 方法

from django.middleware.csrf import get_token
# 获取cstftoken
def getToken(request):
    token = get_token(request)
    return HttpResponse(json.dumps({'token': token}), content_type="application/json,charset=utf-8")
 

urls.py 配置URL

from django.urls import path, re_path
from . import views
urlpatterns = [
    # ex:/assetinfo/getToken
    path('getToken', views.getToken, name='getToken'),
 

使用 postman 测试接口,获取 csrftoken

image-20200601155201234

现在是完成了基本功能了,能否动态获取 csrftoken,但是还有一个跨域问题,假如跨域后就无法获取 csrftoken 了。

我尝试过在Django中设置跨域返回的方式,但是这是不行的,因为不同的域名使用 csrftoken 就基本失去了原来的防止 csrf 攻击的意义。

最好的方式是使用 nginx 做本机的代理,分别反向代理前端、后端的服务,然后统一提供一个域名使用,即可使用 csrftoken 了。

在 postman 设置使用 csrftoken

当想要在 postman 中使用 csrftoken,那么只需要将获取的 csrftoken 值设置到 Headers 中即可,如下:

image-20200602112047276
{"X-CSRFToken":"K6q7uqt9J8UocELWR04pw2DKd8T2LRNWjf2uQvsFBWm87Q1lJZQV1vj3pR8REzCR"}
 

如果不设置,那么则会出现 403拒绝报错 如下:

image-20200602112127065 需求一般Django开发为了保障避免 csrf 的攻击,如果使用Django的模板渲染页面,那么则可以在请求中渲染设置一个csrftoken的cookie数据,但是如果需要前后端分离,...
第一种方式ensure_csrf_cookie 这种方方式使用ensure_csrf_cookie 装饰器实现,且前端页面由浏览器发送视图请求,在视图中使用render渲染模板,响应给前端,此时这个渲染模板的视图函数上要加上这个装饰器 这种方式保证了模板返回时,前端接收到的响应中有csrftoken这个cookie,方法见代码。 以上方法并没有严格意义的前后分离,如果模板中有form表单,可以直接在模板中添加{% csrf_token %}。 第二种方式 前后完全分离,前端页面直接通过获取静态文件得到,然后直接发送ajax请求,得到csrftoken,此时需要一个视图函数来返回tokenCSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式 1、用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A; 2、在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A; 3、用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B...
之前学习django时,总是把那个csrf的中间件注释掉,现在把这个bug修复吧。 1.定义csrftoken接口,主要是为前端设置csrftoken,相关代码如下: from django.middleware.csrf import get_token def getToken(request): token=get_token(request) return Http...
1 在utils文件在建立一个middlewares.py作为中间件,然后继承重写crsf-token from django.middleware.csrf import get_token from django.utils.deprecation import MiddlewareMixin class Middleware...
[root@bigdata111 mapreduce]# hadoop fs -ls -R / 【等同于:Hadoop fs -lsr /】 drwxr-xr-x - root supergroup 0 2021-12-22 12:19 /out -rw-r--r-- 3 root supergroup 0 2021-12-22 12:19 /out/_SUCCESS -rw-r--r-- 3 root supergroup 112 2021-1
在网页中插入highcharts图表,图表数据来自后台mysql数据库。通过该网页提交的参数使highcharts图表更新。对此,图表刷新需通过ajax,局部刷新,并保持网页的设置参数不改变。全网页刷新会导致网页恢复到初始的静态网页,对网页变化的参数设置将全部丢失。 1 highcharts图表初始化 当网页加载初始化时,将触发highcharts初始化代码。django框架下,由url触发的views函数会提交图表输入数据。 $(document).ready(function() { // jQuer
Django中的CSRF(Cross Site Request Forgery)是一种攻击方式,攻击者利用用户已登录的状态,伪造用户的请求,从而执行一些恶意操作。为了防止这种攻击,Django提供了CSRF保护机制。 在Django中,使用{% csrf_token %}标签可以生成一个随机的CSRF令牌。这个令牌会在提交表单时一起提交给服务器,服务器会验证这个令牌是否与用户登录信息匹配,如果不匹配,则认为这是一次恶意请求,服务器会拒绝执行该请求。 使用{% csrf_token %}标签很简单,只需要在表单中添加该标签即可: <form method="post"> {% csrf_token %} <!-- 其他表单元素 --> <button type="submit">提交</button> </form> 在提交表单时,Django会自动将CSRF令牌添加到表单数据中,并在服务器端验证令牌的有效性。