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

我四处搜索,据我所知,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

}

但是错误返回是否也会关闭连接?我如何避免必须阅读所有内容?我发现了这一点,但是如果未设置内容长度,并且在阅读过程中我意识到文件太大,该怎么办。

我将此用作一种安全措施,以防止有人占用我的服务器资源。

回答:

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

r.Body = http.MaxBytesReader(w, r.Body, MaxFileSize) 

err := r.ParseForm()

if err != nil {

// redirect or set error status code.

return

}

当达到限制时,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)

}

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

log.Fatal(http.ListenAndServe(":8080", &maxBytesHandler{h:mux, n:4096))

或配置服务器时:

s := http.Server{

Addr: ":8080",

Handler: &maxBytesReader{h:mux, n:4096},

}

log.Fatal(s.ListenAndServe())

不需要其他答案中建议的补丁。MaxBytesReader是限制请求正文大小的官方方法。

以上是 在使用golang时,是否建议(进一步)限制表单的大小? 的全部内容, 来源链接: utcz.com/qa/403210.html

回到顶部