我正在使用 Appengine Blob 商店示例,它工作正常(我修改为采用两个文件,但这不是问题)。但是,当我打开nosurf 时,它会给我一个HTTP 400. 我正在将 csrf 令牌传递给我的表单。即使我只上传一个文件,问题仍然存在。nosurf 适用于其他形式,但只会给我带来 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状态): http.HandleFunc("/", handleRoot) http.HandleFunc("/serve/", handleServe) http.HandleFunc("/upload", handleUpload)这是与nosurf还是有关app-engine?关于我应该怎么做来解决这个问题的任何建议?
1 回答
ABOUTYOU
TA贡献1812条经验 获得超5个赞
blobstore 上传 URL 的工作原理是将您的文件上传实际发布到/_ah/...
您的应用程序上的特殊路由,该路由实际上并不由您的应用程序处理,而是用作基础设施将数据发送到存储上传处理程序的信号,这是一个执行实际放入存储的内部处理程序。
您传递给生成上传 URL 的函数的回调路由是应用程序上的路由,该路由完成后将接收请求,该请求不包含文件数据,但包含文件元数据(例如文件名)以及任何其他传递的参数到请求(例如,重要的是 CSRF 令牌)。
但是,您传递的令牌是通过调用 生成的nosurf.Token(r)
,其中r
是用户浏览器在生成页面时向您的应用程序发出的请求。当存储上传处理程序向您的/upload
路由发送回调请求时,nosurf 期望发送请求的客户端为该客户端(存储上传处理程序)生成有效的 CSRF 令牌,并根据该期望验证该请求。相反,它接收为您最初发送给用户的页面生成的 CSRF 令牌,其中包含表单。
- 1 回答
- 0 关注
- 152 浏览
添加回答
举报
0/150
提交
取消