我想從需要登錄的站點自動備份網站內容。我嘗試通過模擬POST請求來登錄。但我得到的錯誤:使用Go/Python登錄到使用CSRF令牌的網站
csrf token: CSRF attack detected
下面是從代碼中的一些提取物我用:
func postLoginForm(csrfToken string) {
values := make(url.Values)
values.Set("signin[username]", "myusername")
values.Set("signin[password]", "mypassword")
values.Set("signin[_csrf_token]", csrfToken)
resp, err := http.PostForm("https://spwebservicebm.reaktor.no/admin/nb", values)
dumpHTTPResponse(resp) // show response to STDOUT
}
的CSRF令牌,我得到通過獲取登錄頁面並掃描它命名爲signin[_csrf_token]
一個隱藏的輸入字段。這樣做的代碼的重要組成部分如下:
// Finds input field named signin[_csrf_token] and returns value as csrfToken
func handleNode(n *html.Node) (csrfToken string, found bool) {
if n.Type == html.ElementNode && n.Data == "input" {
m := make(map[string]string)
for _, attr := range n.Attr {
m[attr.Key] = attr.Val
}
if m["name"] == "signin[_csrf_token]" {
return m["value"], true
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
if csrfToken, found = handleNode(c); found {
return
}
}
return "", false
}
我並不需要使用去,只是因爲我最熟悉。使用python也可能是一個解決方案,但我沒有更多的運氣。
您可以使用python請求並使用會話來存儲所有cokies,http://stackoverflow.com/questions/12737740/python-requests-and-persistent-sessions –
如果您使用Go,您可能需要創建一個cookie罐子爲您的客戶。如果http.Client.Jar爲零,則Cookie不會在請求中發送,並且在響應中被忽略。 –
是的,我有一種感覺,它必須是一個cookie問題,因爲如果不使用cookie,服務器將不知道第二個請求是從我這裏得到的,可能會認爲我欺騙了webclient或其他東西。我會盡力弄清楚如何在Go中使用cookies。 –