概述
先说一句,这里我还没有找到我觉得合理的解决方案,记录了一些概念性的东西,还有别人的一些解决方法,但是我总觉得有点问题,希望有路过的同学,如果看明白了我的疑惑,能帮我解惑一下
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问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复