在使用golang时,是否建议(进一步)限制表单的大小?

Joh*_*ohn 15 go

我四处搜索,据我所知,POST表单请求已限制为10MB(http://golang.org/src/net/http/request.go#L721).

如果我要在我的ServeHTTP方法中减少这个,我不确定如何正确地做到这一点.我会尝试这样的事情:

r.Body = http.MaxBytesReader(w, r.Body, MaxFileSize) 
err := r.ParseForm()
if err != nil {
     //redirect to some error page
     return
}
Run Code Online (Sandbox Code Playgroud)

但是如果错误返回也会关闭连接吗?我怎么能阻止阅读所有内容?我发现了这个:https://stackoverflow.com/a/26393261/2202497,但是如果没有设置内容长度并且在阅读过程中我意识到文件太大了怎么办?

我正在使用它作为安全措施,以防止有人占用我的服务器资源.

Cer*_*món 27

限制请求正文大小的正确方法是按照您的建议执行:

r.Body = http.MaxBytesReader(w, r.Body, MaxFileSize) 
err := r.ParseForm()
if err != nil {
 // redirect or set error status code.
 return
}
Run Code Online (Sandbox Code Playgroud)

达到限制时,MaxBytesReader 在响应上设置标志.设置此标志后,服务器不会读取请求正文的其余部分,服务器会在从处理程序返回时关闭连接.

如果您担心恶意客户端,那么您还应该设置Server.ReadTimeout,Server.WriteTimeout以及可能的Server.MaxHeaderBytes.

如果要为所有处理程序设置请求主体限制,请使用在委派给根处理程序之前设置限制的处理程序包装根处理程序:

 type maxBytesHandler struct {
     h http.Handler
     n int64
 }

 func (h *maxBytesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
     r.Body = http.MaxBytesReader(w, r.Body, h.n) 
     h.h.ServeHTTP(w, r)
 }
Run Code Online (Sandbox Code Playgroud)

在调用ListenAndServe时包装根处理程序:

log.Fatal(http.ListenAndServe(":8080", &maxBytesHandler{h:mux, n:4096))
Run Code Online (Sandbox Code Playgroud)

或配置服务器时:

s := http.Server{
    Addr: ":8080",
    Handler: &maxBytesReader{h:mux, n:4096},
}
log.Fatal(s.ListenAndServe())
Run Code Online (Sandbox Code Playgroud)

根据另一个答案的建议,不需要补丁.MaxBytesReader是限制请求体大小的官方方式.