为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Nosurf 和 A​​ppengine Blobstore 时的 HTTP 400

使用 Nosurf 和 A​​ppengine Blobstore 时的 HTTP 400

Go
开满天机 2021-09-13 15:09:11
我正在使用 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 令牌,其中包含表单。


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信