我是靠谱客的博主 火星上金毛,最近开发中收集的这篇文章主要介绍关于前后端分离时,如何解决djaogo的CSRF问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

先说一句,这里我还没有找到我觉得合理的解决方案,记录了一些概念性的东西,还有别人的一些解决方法,但是我总觉得有点问题,希望有路过的同学,如果看明白了我的疑惑,能帮我解惑一下

1.如果前后端都使用django来完成,那么这个CSRF防御应该是挺好解决的,可以在表单中加入{% csrf_token %}来完成。

<form action="add_book" method="post">
        {% csrf_token %}
        name: <input name="bookname">
        <button type="submit">提交</button>
    </form>

这样,当浏览器在渲染这个表单时,会随机生成一个隐藏的input,value为随机的字符串,同时将一个csrftoken 存到cookie中

<input type="hidden" name="csrfmiddlewaretoken" value="3LO2cifZp9TcZR1CHYDzmQL2DzMcrEAC7VWOUpiE3wF3Fu3aEwR6k9YiiBXE5RbS">

==================================

csrftoken: fAbDG5qO1xRaEQGPvbOnFmhYInTCBToljKjpocttFUD1ktInsJ2UDFuenp44f6ZB

提交表单时,django 会将这两个进行验证,从而完成防御。
在这里,csrftoken的生成和存储都是直接在django完成,外域无法获取cookie中的csrftoken,因此无法进行请求伪造。
2. 那么前后端分离时怎么办呢?比如vue + django(这是我的疑惑所在)
在vue中显然无法通过{% csrf_token %}来生成随机字符串和csrftoken。这是可以通过在表单提交时,将cookie 中的csrftoken作为请求头进行发送就可以了,而且不需要再携带随机字符串。

header:
X-CSRFToken: tCbZrFYaUFkF6tqRPIRMQr4Brh3g1VzW5qLXSJhoLrswjzjre2gF4OzYqtNFkpQo

如果cookie中还没有csrftoken,我们可以通过访问一个指定函数让django显式生成,并存储到cookie中。

from django.middleware.csrf import get_token
def get_token(request):
   if request.method == "GET":
		token = django.middleware.csrf.get_token(request)
		return HttpResponse("OK")

这样就可以从cookie中获取csrftoken,并将其放置在请求头中。
以上是我在百度上找到的前后端分离解决方法,绝大部分的解决思路都是一致的。但是这样怎么可以进行防御呢,下面写出我的一些疑惑:
首先我同样可以在另外一个网站通过js来发送一个Get请求,虽然有同源策略,但是还是有办法可以完成的。这样这个cookie就会保存在我当前网站下,那么我就可以去获取,并且设置在请求头中,然后进行请求伪造,我利用vue确实也实现了这个。那这样CSRF检测不就失效了吗? 那么原则上,可以使用这种方法来对所有使用django的网络来发动CSRF攻击,不知道我哪里理解出了问题,希望看到这篇博客的同学给我解惑一下!!!

最后

以上就是火星上金毛为你收集整理的关于前后端分离时,如何解决djaogo的CSRF问题的全部内容,希望文章能够帮你解决关于前后端分离时,如何解决djaogo的CSRF问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部