- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
损坏的 HTTP 客户端向我们基于 Jetty 的 HTTP 服务器发送了一些请求,其中 URL 中包含换行符。 Jetty 将此视为 HTTP/0.9 请求,在换行符处截断 URL,忽略请求 header ,并发回不带 header 或状态行的响应。
我相信根据 spec 这基本上是正确的,尽管 Jetty 不需要 CRLF 并且很乐意对 GET 以外的请求执行此操作。但是newer specs请注意,HTTP/0.9 请求主要表明客户端感到困惑。在我们的例子中,如果发送错误消息,客户(和我们)可以避免一些困惑的故障排除。
如何让 Jetty 对 URL 中带有换行符的请求返回错误响应?我很乐意使用 Jetty 级配置或 Web 应用程序级代码。
最佳答案
首先,support for HTTP/0.9 has been completely removed in Jetty 9.3+ .
让我们看看行为是什么......
Jetty 发行版 9.2.7.v20150116,运行演示库:
正常 HTTP/1.0 请求:
$ printf "GET / HTTP/1.0\r\n\r\n" | nc localhost 8080
HTTP/1.1 200 OK
Set-Cookie: visited=yes
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Accept-Ranges: bytes
Content-Type: text/html
Last-Modified: Sat, 17 Jan 2015 00:25:03 GMT
Content-Length: 2773
Server: Jetty(9.2.7.v20150116)
<html xmlns=\ "http://www.w3.org/1999/xhtml\" xml:lang=\"en\">
那里有 header ,看起来也像 HTTP/1.0 响应 header 。
正常 HTTP/1.1 请求:
$ printf "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 8080
HTTP/1.1 200 OK
Set-Cookie: visited=yes
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Accept-Ranges: bytes
Content-Type: text/html
Last-Modified: Sat, 17 Jan 2015 00:25:03 GMT
Content-Length: 2773
Connection: close
Server: Jetty(9.2.7.v20150116)
<html xmlns=\ "http://www.w3.org/1999/xhtml\" xml:lang=\"en\">
看起来也很正常。甚至包括 HTTP/1.1 特定 header 。
现在让我们尝试使用嵌入的 CRLF 的 HTTP/1.0:
$ printf "GET /\r\nHTTP/1.0\r\n\r\n" | nc localhost 8080
<html xmlns=\ "http://www.w3.org/1999/xhtml\" xml:lang=\"en\">
没有响应 header 。
为什么会发生这种情况?
嗯,Jetty 无法确定 HTTP 版本,因此它没有可以响应的有效 header 集。所以它的响应没有 header 。令人惊讶的是 1.0 之前的 HTTP 规范的行为方式。
现在让我们尝试 Jetty Distribution 9.3.x,以及具有相同 CRLF 问题的演示基础配置。
$ printf "GET /\r\nHTTP/1.0\r\n\r\n" | nc localhost 8080
HTTP/1.1 400 HTTP/0.9 not supported
Content-Length: 0
Connection: close
Server: Jetty(9.3.0-SNAPSHOT)
现在,在现代,HTTP/2 即将到来,这更有意义。
关于java - 如何让 Jetty 返回错误响应而不是假设 HTTP/0.9 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28504970/
我是一名优秀的程序员,十分优秀!