如何使用javascript从给定的csrftoken构造csrfmiddlewaretoken?

问题描述:

我正在工作如何登录到邮递员的Django网站。 使用Charles我可以看到一个csrfmiddlewaretoken令牌以某种方式创建。如何使用javascript从给定的csrftoken构造csrfmiddlewaretoken?

鉴于

csrftoken=JDmmXqnLK35WCLha1PVOhFWITaKZs9eeAWBfuqXUxZEt3yDHmNoOyzMyJUQF5aQd 

的csrfmiddlewaretoken发送被

v3I6Io9H8OoZcp4ATyszhAepdQAEp617mmXZfoJQVKXwDcq7ewVzyu4f3AGk27D6 

能 v3I6Io9H8OoZcp4ATyszhAepdQAEp617mmXZfoJQVKXwDcq7ewVzyu4f3AGk27D6 从
JDmmXqnLK35WCLha1PVOhFWITaKZs9eeAWBfuqXUxZEt3yDHmNoOyzMyJUQF5aQd 使用JavaScript构建的?

+0

你要什么,以实现与在Javascript中构建csrf标记? – Swapnil

+0

唯一不同于我可以看到的是什么有效并且失败的是提供csrfmiddlewaretoken。在http调用中使用浏览器和charles csrfmiddlewaretoken。我正在寻找创建csrfmiddlewaretoken来发送postman post请求,并希望登录到系统。 –

+0

在提问的时候,我有了这个网站可能会产生它的想法......这是! –

这个问题的关键是理解其中csrfmiddlewaretoken是从哪里来的。 我以为它是从csrftoken以某种方式构建的。 我意识到它必须是服务器提供的隐藏变量。

所以问题就变成了如何从初始get调用中提取csrfmiddlewaretoken值来登录。注意邮差现在使用加入jQuery的cheerio。

在get call中使用postman jetpack这是我用来提取隐藏输入值的测试。

tests["responseCode.code === 200"] = responseCode.code === 200 ; 
var csrftoken = postman.getResponseCookie("csrftoken").value ; 
tests['csrftoken: ' + csrftoken ] = csrftoken.length > 0 ; 
var html ; 
html = cheerio(responseBody) ; 
inputs = html.find('input') ; 
csrfmiddlewaretoken = '' ; 
postman.setEnvironmentVariable("csrfmiddlewaretoken", csrfmiddlewaretoken) ; 
for(var index = 0 ; index < inputs.length ; index++) { 
    var input = inputs[index] ; 
    if (input.attribs.name === 'csrfmiddlewaretoken') { 
     csrfmiddlewaretoken = input.attribs.value ; 
     postman.setEnvironmentVariable("csrfmiddlewaretoken", csrfmiddlewaretoken) ; 
    } 
} 
tests['csrfmiddlewaretoken: ' + csrfmiddlewaretoken ] = csrfmiddlewaretoken.length > 0 ; 

然后在通话后实际登录。

我不得不根据网站安全策略添加Referer头。

Content-Type:application/x-www-form-urlencoded 
Referer:{{referer}} 

表单值

csrfmiddlewaretoken:{{csrfmiddlewaretoken}} 
username:{{username}} 
password:{{password}} 
next:{{next}} 

,然后在发送后电话邮递员脚本成功登录

pm.test("Status code is 200", function() { 
    pm.response.to.have.status(200); 
}); 

:-)

为了获得CSRF令牌只是通过邮递员登录,你可以做两件事情:

  1. 要么使用开发工具和通过检查你的形式,寻找隐藏拿到CSRF中间件令牌csrfmiddleware输入字段。 (这将在服务器端渲染的情况下起作用)

  2. 从cookie中获取csrf标记。下面是Django文档提到here

    function getCookie(name) { 
        var cookieValue = null; 
        if (document.cookie && document.cookie !== '') { 
         var cookies = document.cookie.split(';'); 
         for (var i = 0; i < cookies.length; i++) { 
          var cookie = jQuery.trim(cookies[i]); 
          // Does this cookie string begin with the name we want? 
          if (cookie.substring(0, name.length + 1) === (name + '=')) { 
           cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
           break; 
          } 
         } 
        } 
        return cookieValue; 
    } 
    var csrftoken = getCookie('csrftoken'); 
    

一旦你获得了CSRF令牌jQuery的工具,只需添加一个头在邮差您的要求与关键X-CSRFToken和值作为CSRF令牌。

希望这是有益:)

+0

我已经试过,但谢谢! –

+0

这不适合你吗? – Swapnil

+0

不,我已经制定了一个解决方案。我会在发布后立即发布。 –