一般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,此时需要一个视图函数来返回token值
CSRF(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令牌添加到表单数据中,并在服务器端验证令牌的有效性。