2017-09-29 62 views
0

我正在工作如何登錄到郵遞員的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

在提問的時候,我有了這個網站可能會產生它的想法......這是! –

回答

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); 
}); 

:-)

0

爲了獲得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

不,我已經制定了一個解決方案。我會在發佈後立即發佈。 –