我正在使用 Appengine Blob 商店示例,它工作正常(我修改為采用兩個文件,但這不是問題)。但是,當我打開nosurf 時,它會給我一個HTTP 400. 我正在將 csrf 令牌傳遞給我的表單。即使我只上傳一個文件,問題仍然存在。nosurf 適用于其他形式,但只會給我?guī)?blobstore 文件上傳的麻煩。由于代碼很大(這只是一些小調整的例子),我把它放在這里:http : //play.golang.org/p/SJADmn-WvJ(當然你不能在那里運行它,因為你需要應用引擎和 nosurf)代碼的小部分:const rootTemplateHTML = `<html><body><form action="{{.UpUrl}}" method="POST" enctype="multipart/form-data"> Upload File: <input type="file" name="file1"><br> Upload File: <input type="file" name="file2"><br> <input type="hidden" name="csrf_token" value="{{ .Token }}"> <input type="submit" name="submit" value="Submit"></form></body></html>`這不起作用: http.Handle("/", nosurf.New(http.HandlerFunc(handleRoot))) http.Handle("/upload", nosurf.New(http.HandlerFunc(handleUpload))) http.HandleFunc("/serve/", handleServe)但這有效(無400狀態(tài)): http.HandleFunc("/", handleRoot) http.HandleFunc("/serve/", handleServe) http.HandleFunc("/upload", handleUpload)這是與nosurf還是有關app-engine?關于我應該怎么做來解決這個問題的任何建議?
1 回答

ABOUTYOU
TA貢獻1812條經驗 獲得超5個贊
blobstore 上傳 URL 的工作原理是將您的文件上傳實際發(fā)布到/_ah/...
您的應用程序上的特殊路由,該路由實際上并不由您的應用程序處理,而是用作基礎設施將數據發(fā)送到存儲上傳處理程序的信號,這是一個執(zhí)行實際放入存儲的內部處理程序。
您傳遞給生成上傳 URL 的函數的回調路由是應用程序上的路由,該路由完成后將接收請求,該請求不包含文件數據,但包含文件元數據(例如文件名)以及任何其他傳遞的參數到請求(例如,重要的是 CSRF 令牌)。
但是,您傳遞的令牌是通過調用 生成的nosurf.Token(r)
,其中r
是用戶瀏覽器在生成頁面時向您的應用程序發(fā)出的請求。當存儲上傳處理程序向您的/upload
路由發(fā)送回調請求時,nosurf 期望發(fā)送請求的客戶端為該客戶端(存儲上傳處理程序)生成有效的 CSRF 令牌,并根據該期望驗證該請求。相反,它接收為您最初發(fā)送給用戶的頁面生成的 CSRF 令牌,其中包含表單。
- 1 回答
- 0 關注
- 163 瀏覽
添加回答
舉報
0/150
提交
取消