当前位置: 首页 > 面试题库 >

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

湛文乐
2023-03-14
问题内容

我四处搜索,据我所知,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是限制请求正文大小的官方方法。



 类似资料:
  • 问题内容: 你用代替吗? 我的意思是作为返回值或设置String变量的值。我不是要进行比较,因为我们在那里使用 问题答案: 当然不是。您是否真的认为“”不够清晰? 常量本质上有3个用例: 记录值的含义(常量名+ javadoc) 根据通用值同步客户端。 提供一个特殊值的捷径,以避免一些启动费用 在此均不适用。

  • 问题内容: 进程的大小是否有限制?它是否仅取决于机器的性能?我想知道这一点,以限制对函数的递归调用的深度。 谢谢。 问题答案: 堆栈通常受资源限制的限制。您可以使用以下命令查看安装的默认设置: (这表明我的是8MB,这是巨大的)。 如果删除或增加该限制,您仍将无法使用计算机中的所有RAM作为堆栈- 堆栈从进程地址空间顶部附近的一点向下增长,并在某个时刻它将运行到您的代码,堆或已加载的库中。

  • 我们知道,有一个最大可重入限制:;块也有可重入限制吗? 更新:我发现很难为同步可重入编写测试代码: 有人能帮我写一些同步可重入极限测试的代码吗?

  • 问题内容: 我需要将搜索功能添加到在tomcat上运行的Java Web应用程序中,以及数据库以及同一台计算机上。 由于我计划在同一台计算机上使用Solr,但应使用哪种实现?我以为嵌入式嵌入式服务器更可取,因为我需要从同一台计算机添加数据,因此通过HTTP添加将没有多大意义,不是吗?而且将Solr作为单独的Web应用程序运行将比嵌入式Web应用程序消耗更多的资源(不是吗?)。 但是现在不建议使用E

  • 问题内容: 我有两个文件,它们合并在一起的长度小于600字节(.6kb),如下所示。 那么我的app.bundle.js太大了(987kb),又如何管理它的大小又如何呢? src文件index.js src文件print.js webpack.config.js package.json 警告信息: 资产大小限制警告:以下资产超过了建议的大小限制(244 KiB)。这可能会影响网络性能。资产:ap

  • 请参见:http://jsfiddle.net/zemar(必须使用Firefox或Opera才能查看) 单击时,下拉框的样式设置为匹配,但如果从文本框中的数据列表中开始键入术语,则出现的建议没有设置样式,因此与样式的其余部分不匹配。