2012-05-16 116 views
34

我正在使用curl來測試我的Django表單之一。我已經嘗試了電話(從每個錯誤,並在多個行以便於閱讀):如何使用curl與Django,csrf標記和POST請求

(1):

curl 
-d "{\"email\":\"[email protected]\"}" 
--header "X-CSRFToken: [triple checked value from the source code of a page I already loaded from my Django app]" 
--cookie "csrftoken=[same csrf value as above]" 
http://127.0.0.1:8083/registrations/register/ 

(與cookie的HTTP標頭和csrftoken),導致400錯誤與沒有數據返回。

(2):

curl 
-d "{a:1}" 
--header "X-CSRFToken:[as above]" 
--cookie "csrftoken=[as above];sessionid=[from header inspection in Chrome]" 
http://127.0.0.1:8083/registrations/register/ 

(如在(1),但在頭屬性聲明沒有空格,並用sessionid在餅乾太)的結果相同的400錯誤沒有數據返回。

(3):

curl 
-d "{a:1}" 
--header "X-CSRFToken:[as above]" 
http://127.0.0.1:8083/registrations/register/ 

(僅與X-CSRFToken HTTP標頭,沒有Cookie)導致的錯誤代碼403,與消息:CSRF餅乾未設置。

如何使用捲曲測試我的表單?除了cookie值和http頭之外,我還沒有考慮哪些因素?

+1

你能告訴我你是怎麼得到的X-CSRF令牌? '--header:' –

回答

11

嘗試:

curl 
-d "[email protected]&a=1" 
http://127.0.0.1:8083/registrations/register/ 

尤其要注意-d參數格式。

但是,這可能無法正常工作,因爲您的視圖可能需要POST請求而不是GET請求。因爲它會修改數據,而不僅僅是返回信息。

僅對'不安全'請求(POST,PUT,DELETE)需要CSRF保護。它通過檢查'csrftoken'cookie反對'csrfmiddlewaretoken'表單字段或'X-CSRFToken'http頭來工作。

所以:

curl 
-X POST 
-d "[email protected]&a=1&csrfmiddlewaretoken={inserttoken}" 
--cookie "csrftoken=[as above]" 
http://127.0.0.1:8083/registrations/register/ 

它也可以使用--header "X-CSRFToken: {token}",而不是把它放置在表單數據。

+1

-d「X-CSRFToken [三重檢查,從我已經從我的Django應用程序加載的頁面的源代碼值]」意味着POST所以額外的-X完全是多餘的 –

+1

我不得不添加的SessionID到cookie,以及它在我的情況下工作:'--cookie「csrftoken = [如上];會話ID = [相應的會話ID]」我已經發布了基於凱文在HTTP響應完全編碼回答' – yellowcap

26

達米安的迴應和你的例子號碼2的混合物爲我工作。我用一個簡單的登錄頁面來測試,我期望你的註冊視圖是相似的。達米安的迴應幾乎奏效,但缺少sessionid cookie。

我推薦一個更強大的方法。您可以嘗試使用curl內置的cookie管理系統來模擬完整的用戶交互,而不是從其他請求手動輸入cookie。這樣,可以減少犯錯誤的機會:

$ curl -v -c cookies.txt -b cookies.txt host.com/registrations/register/ 
$ curl -v -c cookies.txt -b cookies.txt -d "[email protected]&a=1&csrfmiddlewaretoken=<token from cookies.txt>" host.com/registrations/register/ 

第一卷曲模擬用戶首先到達一個GET請求的頁面,和所有必要的cookie被保存。第二個捲曲模擬填充表單域並將它們作爲POST發送。請注意,您必須按照Damien的建議在POST數據中包含csrfmiddlewaretoken字段。

+1

: //stackoverflow.com/questions/21306515/how-to-curl-an-authenticated-django-app/24376188#24376188。 Django也要求你指定一個引用者('-e')。 – Peterino

3

這裏是我是怎麼做的,用剩下的框架教程

打開瀏覽器,例如鉻然後按F12打開開發人員選項卡,然後使用您的用戶憑據監控網絡,登錄和監控POST

讓你CRSF令牌,然後在捲曲執行:

curl http://127.0.0.1:8000/snippets/ \ 
-X POST \ 
-H "Content-Type: application/json" \ 
-H "Accept: text/html,application/json" \ 
-H "X-CSRFToken: the_token_value" \ 
-H "Cookie: csrftoken=the_token_value" \ 
-u your_user_name:your_password \ 
-d '{"title": "first cookie post","code": "print hello world"}' 

我認爲它的清潔劑不能放在體內的令牌,而是使用X-CSRFToken

+0

我需要'-H「X-CSRFToken:the_token_value」'屬性才能使其工作。完整代碼,首先獲取cookie curl -v -c cookies.txt -b cookies.txt http:// url.com'。我打開和複製出來從'cookies.txt'的'csrftoken'然後貼:'捲曲-v -c cookie.txt的-b cookie.txt的-H 「X-CSRFToken:< the token >」 --data「富=欄&csrftoken = < the token > 「HTTP:// url.com' – jbergantine

4

標頭,我用捲曲像這樣工作

  • 你必須在標題爲X-CSRFToken提交csrftoken。
  • 您必須以JSON格式提交表單數據。 演示,

首先我們將獲取csrf_token &店cookie.txt(或cookie.jar他們稱之爲)

$ curl -c cookie.txt http://localhost.com:8000/ 

cookie.txt內容

# Netscape HTTP Cookie File 
# http://curl.haxx.se/docs/http-cookies.html 
# This file was generated by libcurl! Edit at your own risk. 
localhost.com FALSE / FALSE 1463117016 csrftoken vGpifQR12BxT07moOohREGmuKp8HjxaE 

接下來我們以json格式重新發送用戶名和密碼。 (你可以以正常的方式發送)。檢查json數據轉義。

$curl --cookie cookie.txt http://localhost.com:8000/login/ -H "Content-Type: application/json" -H "X-CSRFToken: vGpifQR12BxT07moOohREGmuKp8HjxaE" -X POST -d "{\"username\":\"username\",\"password\":\"password\"}" 
{"status": "success", "response_msg": "/"} 
$ 

你可以存儲在同一個文件或新文件的收益新csrf_token會話cookie(我一直在使用-c選項保存在同一文件中。)

$curl --cookie cookie.txt http://localhost.com:8000/login/ -H "Content-Type: application/json" -H "X-CSRFToken: kVgzzB6MJk1RtlVnyzegEiUs5Fo3VRqF" -X POST -d "{\"username\":\"username\",\"password\":\"password\"}" -c cookie.txt 

的cookie.txt

-content
# Netscape HTTP Cookie File 
# http://curl.haxx.se/docs/http-cookies.html 
# This file was generated by libcurl! Edit at your own risk. 

localhost.com FALSE / FALSE 1463117016 csrftoken vGpifQR12BxT07moOohREGmuKp8HjxaE 
#HttpOnly_localhost.com FALSE / FALSE 1432877016 sessionid cg4ooly1f4kkd0ifb6sm9p 

當您在cookie.txt中存儲新的csrf_token &會話ID Cookie時,您可以在整個網站上使用相同的cookie.txt。

您正在從cookie.txt(--cookie)的以前請求中讀取cookie,並在相同的cookie.txt(-c)中響應寫入新的cookie。

閱讀&提交表單現在可以與csrf_token一起使用&會話ID。

$curl --cookie cookie.txt http://localhost.com:8000/home/ -H "Content-Type: application/json" -H "X-CSRFToken: vGpifQR12BxT07moOohREGmuKp8HjxaE" -c cookie.txt 
1

curl-auth-csrf能夠這樣做對你的一個基於Python的開源工具:「Python的工具,模仿捲曲,但執行登錄和處理任何跨站請求僞造(CSRF)令牌有用的。通常只能在登錄時才能訪問HTML。「

這將是你的語法:

echo -n YourPasswordHere | ./curl-auth-csrf.py -i http://127.0.0.1:8083/registrations/register/ -d '[email protected]&a=1' http://127.0.0.1:8083/registrations/register/ 

這將沿中所列的POST數據傳遞,而且還包括通過標準輸入傳遞的密碼。我假設你在「登錄」後訪問的頁面是同一頁面。

完全披露:我是curl-auth-csrf的作者。

+0

你有一種方法來存儲生成到一個文件中的cookie,類似於如何捲曲這樣做,這樣其他捲曲命令可以針對該cookie後運行?我瀏覽了你的代碼,並沒有看到如何做到這一點。如果那樣的話,這將非常有用,因爲我需要在登錄後進行POST,而不是GET。 –

+0

curl以舊的Netscape格式使用Cookie。您可以使用Python的http.cookiejar.MozillaCookieJar以格式保存()cookie。例如,查看[這個答案](http://stackoverflow.com/a/25858635/3376504)。但是,通常情況下,這可能比所需的更困難。對於你想抓住具有餅乾後,作出任何捲曲的請求,你可以簡單地這些網址添加到列表中,你使用'捲曲AUTH-csrf.py'。該腳本將以您的名義應用會話Cookie。 – j0nam1el

0

X-CSRFToken只需要與cookie中的csrftoken相同。

例子:

curl -v http://www.markjour.com/login/ -H "X-CSRFToken: 123" -b "csrftoken=123" -d "username=admin&password=admin"