【问题标题】:Using Tomcat or Spring to check if content-length header is set correctly in request使用 Tomcat 或 Spring 检查请求中是否正确设置了 content-length 标头
【发布时间】:2016-09-15 03:10:24
【问题描述】:

在更广泛的上下文中,我们希望限制客户端可以通过 http post 请求发送到服务器的消息的大小。

我想通过使用 http 标头内容长度来做到这一点。 所以我不必阅读全文,只需检查此标头,然后拒绝请求,如果 content-length 太大,如果 content-lenght 丢失也拒绝(http 411错误代码)

所以我想确保消息体的实际大小与请求的内容长度中设置的大小相同。

问题是 Tomcat 或 Spring MVC(我的堆栈)是否会验证内容长度是否实际上代表消息体的实际大小?

(使用过滤器应该很容易实现它,只是想知道 servlet 容器或 spring 调度程序 servlet 是否开箱即用。)

【问题讨论】:

  • 我认为 filter 方法是可行的方法——这是一个专门的用例,Tomcat 或 Spring 都默认不这样做。
  • 别忘了还有Chunked transfer encoding
  • 如果没有,它绝对应该。 DDOS 的潜在攻击媒介。
  • 谢谢@Ilya - 我们将在这里自动拒绝分块请求。
  • @stdunbar - 我的用例很特殊,但总的来说,可以检查消息正文是否真的是内容长度中的大小,无论如何,如果你把它作为答案我接受它,谢谢!

标签: spring-mvc tomcat servlets content-length


【解决方案1】:

Tomcat 处理它。

在一个带有案例的简单网络应用上进行了一些测试后:

  1. 如果 content-lenght 不存在,它将从内容中读取 0 个字节。
  2. 如果我们有比 content-lenght 标头中提供的更长的内容,并且 keep-alive 为真,那么在读取大小内容长度的正文后,它将尝试将剩余的正文作为新请求处理(并且会失败有错误的请求)
  3. 在与第 2 点相同的情况下,只是 keep alive 是假的,我们仍然会收到长度为 content-length 标头的正文。

【讨论】:

  • 您能指出显示 Tomcat 如何/在何处处理它的文档或源代码吗?谢谢
  • 我没有在源代码中搜索它,我只是用 nc 和其他花哨的命令行工具测试它。
  • 如果内容小于content-length怎么办?
  • 最近没试过,可能会有阻塞等待数据
猜你喜欢
  • 2012-01-22
  • 2019-11-21
  • 2018-04-06
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多