csrf_token的了解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csrf_token的了解相关的知识,希望对你有一定的参考价值。

参考技术A django中写form表单时csrf_token的作用: https://blog.csdn.net/up1012/article/details/81032368

Django下的CSRF预防机制

https://www.cnblogs.com/freely/p/6928822.html

CSRF预防机制

CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。

token防御的整体思路是:

第一步:后端随机产生一个token,把这个token保存在SESSION状态中;同时,后端把这个token交给前端页面;

第二步:下次前端需要发起请求(比如发帖)的时候把这个token加入到请求数据或者头信息中,一起传给后端;

第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;

1、Django下的CSRF预防机制

django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,

这样就能避免被 CSRF 攻击。

在 templete 中, 为每个 POST form 增加一个 % csrf_token % tag. 如下:

在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token

在所有的 POST 表单模板中,加一个% csrf_token % 标签,它的功能其实是给form增加一个隐藏的input标签,如下

,而这个csrf_token = cookie.csrftoken,在渲染模板时context中有context['csrf_token'] = request.COOKIES['csrftoken']

在通过表单发送POST到服务器时,表单中包含了上面隐藏了crsrmiddlewaretoken这个input项,服务端收到后,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.

在通过 ajax 发送POST请求到服务器时,要求增加一个x-csrftoken header,其值为 cookie 里的 csrftoken 的值,服务湍收到后,django会验证这个请求的cookie里的csrftoken字段与ajax post消息头中的x-csrftoken header是否相同,如果相同,则表明是一个合法的请求

具体实现方法

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:

中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。

@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

1、原理

在客户端页面上添加csrftoken, 服务器端进行验证,服务器端验证的工作通过'django.middleware.csrf.CsrfViewMiddleware'这个中间层来完成。在django当中防御csrf攻击的方式有两种:

1.在表单当中附加csrftoken

2.通过request请求中添加X-CSRFToken请求头。

注意:Django默认对所有的POST请求都进行csrftoken验证,若验证失败则403错误侍候。

Django 设置 cookie 中的 csrftoken

http://www.mamicode.com/info-detail-2062660.html

VUE向django发送post返回403:CSRF Failed: CSRF token missing or incorrect解决方案:

https://blog.csdn.net/LoHiauFung/article/details/80792334

http://www.cnblogs.com/wangwei916797941/p/9283776.html

python学习-- {% csrf_token %}

1、不推荐禁用掉django中的CSRF。

2、我们可以再html页面的form表单中添加csrf_token,带着表单的请求一起发送到服务器去验证。

<form  enctype="multipart/form-data" method="post" action="{% url ‘new_article‘ %}">
{% csrf_token %}
  .....
</form>
 

3、在后端一定要使用render()的方法返回数据。

return render(request, ‘article_new.html‘, {‘article_list‘: article_list})

以上是关于csrf_token的了解的主要内容,如果未能解决你的问题,请参考以下文章

TokenMismatchException laravel 5.3

前端模板系统的语法学习

30_Django中关于使用ajax发送请求中`csrf_token`的问题和解决

将 % csrf_token % 添加到 javascript HTML 插入

如何在 javascript 中使用 % csrf_token %

python学习-- {% csrf_token %}