为什么JDK 1.6之后在HttpURLConnection中限制了某些标头?

时间:2018-12-11 16:29:29

标签: java http https header httpurlconnection

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

出于特定原因,我试图在文档中查找受限制的标头,但找不到一个。

这是受限制的标头的列表:

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”)

据说它已作为安全修复程序的一部分被禁用。

我想了解可能造成了哪些安全风险以及如何禁止使用标头是解决此问题的方法,请记住您仍然可以覆盖标头。

链接引用:

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

Why does Content-Length HTTP header field use a value other than the one given in Java code?

Can I override the Host header where using java's HttpUrlConnection class?

1 个答案:

答案 0 :(得分:1)

first link在便笺(绿色文本)中说:

  

这些都是被禁止的,因此用户代理对其保持完全控制

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

由于Java代码不是Web浏览器,因此只有其中一部分受到Java的限制,如指向源代码的链接所示。

仍受限制的标头直接由HttpURLConnection类控制,因此不需要欺骗这些值,因此将其保留为受限制的问题就不会出现。