Dropwizard:如何修复 414 Request-URI 太长
Dropwizard: How to fix 414 Request-URI Too Long
请求 (GET) 或 (POST):
http://localhost:8080/images?name=iVBORw0KGgoAAAANSUhEUgAAAAUA%20AAAFC......
回复:
状态代码:414 请求 URI 太长
连接:关闭
内容长度:0
如何增加请求大小?
您有一个大小超过 8kb 的请求 URI!哎呀!
Request-URI 由于在浏览器、代理和网络硬件中发现了各种漏洞和错误,因此存在限制。
虽然可以增加 Jetty 中的请求 URI 限制检查,但为 Jetty 选择的值代表 public 互联网上各种 http 客户端和中介使用的当前安全最大值。
警告:您不想这样做
这不适合:
- 可从 Internet 访问的 WebServer。
- 可通过 Chrome、Firefox、Safari、MSIE 或 Opera 等浏览器访问的 WebServer。
- 通过 Android、iOS 或 Microsoft mobile 等移动设备访问的 WebServer。
- 前面有代理的 WebServer。
- 使用代理访问 WebServer 的客户端。
这仅对直接与 Jetty 服务器对话的自定义 HTTP 客户端之间的有限事务有用。
Jetty 9.2.6.v20141205 说明
如果您还没有 Jetty Base ${jetty.base}
目录,请创建一个并初始化它。
[user]$ mkdir mybase
[user]$ cd mybase
[mybase]$ java -jar /path/to/jetty-distribution-9.2.6.v20141205/start.jar \
--add-to-start=http,deploy,webapp
编辑${jetty.base}/start.ini
并更改(或添加)以下 属性 为您想要的上限。
jetty.request.header.size=8192
不,没有办法禁用此限制检查。
每增加一次,您就会面临越来越大的问题。
从一些浏览器(最终是所有浏览器)不发送请求开始,更不用说码头接收它了。
与此同时,许多代理服务器处理您的请求的能力开始失效,导致连接或请求终止和失败。有时甚至会截断对 Jetty 的请求。
此外,每次增加都会使您暴露于围绕 headers 中未经检查的限制的各种漏洞,导致各种团体能够执行 CPU 和基于内存的 DOS 攻击,这些攻击只需要很少的网络流量即可执行.
解决此问题的正确方法:
您确实应该切换到基于 POST(或 PUT)的请求数据,而不是在 HTTP 协议的请求 headers 中发送该数量的数据。
一种可能更简单的方法是在您的 yaml 配置文件中设置 requestHeaderSize。这是我们的摘录:
server:
applicationConnectors:
- type: http
maxRequestHeaderSize: 100KiB
显示了其他可能的设置here
请求 (GET) 或 (POST):
http://localhost:8080/images?name=iVBORw0KGgoAAAANSUhEUgAAAAUA%20AAAFC......
回复:
状态代码:414 请求 URI 太长 连接:关闭 内容长度:0
如何增加请求大小?
您有一个大小超过 8kb 的请求 URI!哎呀!
Request-URI 由于在浏览器、代理和网络硬件中发现了各种漏洞和错误,因此存在限制。
虽然可以增加 Jetty 中的请求 URI 限制检查,但为 Jetty 选择的值代表 public 互联网上各种 http 客户端和中介使用的当前安全最大值。
警告:您不想这样做
这不适合:
- 可从 Internet 访问的 WebServer。
- 可通过 Chrome、Firefox、Safari、MSIE 或 Opera 等浏览器访问的 WebServer。
- 通过 Android、iOS 或 Microsoft mobile 等移动设备访问的 WebServer。
- 前面有代理的 WebServer。
- 使用代理访问 WebServer 的客户端。
这仅对直接与 Jetty 服务器对话的自定义 HTTP 客户端之间的有限事务有用。
Jetty 9.2.6.v20141205 说明
如果您还没有 Jetty Base ${jetty.base}
目录,请创建一个并初始化它。
[user]$ mkdir mybase
[user]$ cd mybase
[mybase]$ java -jar /path/to/jetty-distribution-9.2.6.v20141205/start.jar \
--add-to-start=http,deploy,webapp
编辑${jetty.base}/start.ini
并更改(或添加)以下 属性 为您想要的上限。
jetty.request.header.size=8192
不,没有办法禁用此限制检查。
每增加一次,您就会面临越来越大的问题。
从一些浏览器(最终是所有浏览器)不发送请求开始,更不用说码头接收它了。
与此同时,许多代理服务器处理您的请求的能力开始失效,导致连接或请求终止和失败。有时甚至会截断对 Jetty 的请求。
此外,每次增加都会使您暴露于围绕 headers 中未经检查的限制的各种漏洞,导致各种团体能够执行 CPU 和基于内存的 DOS 攻击,这些攻击只需要很少的网络流量即可执行.
解决此问题的正确方法:
您确实应该切换到基于 POST(或 PUT)的请求数据,而不是在 HTTP 协议的请求 headers 中发送该数量的数据。
一种可能更简单的方法是在您的 yaml 配置文件中设置 requestHeaderSize。这是我们的摘录:
server:
applicationConnectors:
- type: http
maxRequestHeaderSize: 100KiB
显示了其他可能的设置here