为什么 JDK 1.6 之后 HttpURLConnection 中的某些 headers 受到限制?

Why are some of the headers restricted in HttpURLConnection after JDK 1.6?

需要对此主题有更深入的了解

出于特定原因,我尝试在受限 headers 的文档中查找,但找不到。

这是受限制的列表 headers:

Accept-Charset Accept-Encoding Access-Control-Request-Headers Access-Control-Request-Method Connection Content-Length Cookie Cookie2 Date DNT Expect Host Keep-Alive Origin Referer TE Trailer Transfer-Encoding Upgrade Via

参考: http://hg.openjdk.java.net/jdk8u/jdk8u-dev/jdk/file/31bc1a681b51/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java#l186

要覆盖这些,需要在 JVM 启动时将 sun.net.http.allowrestrictedheaders 设置为 true 或使用 System.setProperty("sun.net.http.allowRestrictedHeaders", "true")

据说它已作为 security-fix 的一部分被禁用。

我想了解可能引发了哪些安全风险,以及如何禁止使用 headers 来解决这个问题,请记住,您仍然可以覆盖 headers.

参考链接:

https://fetch.spec.whatwg.org/#forbidden-header-name

first link 在注释中说(绿色文本):

These are forbidden so the user agent remains in full control over them

这是为了防止网络浏览器中的恶意 javascript 代码欺骗。

由于 Java 代码不是 Web 浏览器,因此 Java 中只有其中一些受到限制,如源代码的 link 所示。

仍然被限制的headers直接被HttpURLConnectionclass控制,应该不需要伪造值,所以限制它们应该不是问题。