猿问

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

我正在使用 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?关于我应该怎么做来解决这个问题的任何建议?


开满天机
浏览 153回答 1
1回答

ABOUTYOU

blobstore 上传 URL 的工作原理是将您的文件上传实际发布到/_ah/...您的应用程序上的特殊路由,该路由实际上并不由您的应用程序处理,而是用作基础设施将数据发送到存储上传处理程序的信号,这是一个执行实际放入存储的内部处理程序。您传递给生成上传 URL 的函数的回调路由是应用程序上的路由,该路由完成后将接收请求,该请求不包含文件数据,但包含文件元数据(例如文件名)以及任何其他传递的参数到请求(例如,重要的是 CSRF 令牌)。但是,您传递的令牌是通过调用 生成的nosurf.Token(r),其中r是用户浏览器在生成页面时向您的应用程序发出的请求。当存储上传处理程序向您的/upload路由发送回调请求时,nosurf 期望发送请求的客户端为该客户端(存储上传处理程序)生成有效的 CSRF 令牌,并根据该期望验证该请求。相反,它接收为您最初发送给用户的页面生成的 CSRF 令牌,其中包含表单。
随时随地看视频慕课网APP

相关分类

Go
我要回答