XMLHttpRequest.setRequestHeader() should allow Content-Transfer-Encoding header;...
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Oct 2017 20:55:59 +0000 (20:55 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Oct 2017 20:55:59 +0000 (20:55 +0000)
duplicate logic to check for a forbidden XHR header field
https://bugs.webkit.org/show_bug.cgi?id=177829

Reviewed by Alexey Proskuryakov.

Source/WebCore:

Use isForbiddenHeaderName() (defined in HTTPParsers.h) to check if the header field specified
to XMLHttpRequest.setRequestHeader() is allowed. Among other benefits this makes the behavior
of XMLHttpRequest.setRequestHeader() more closely aligned with the behavior of this method in
the XHR standard, <https://xhr.spec.whatwg.org> (8 September 2017). In particular, XMLHttpRequest.setRequestHeader()
no longer forbids setting the header Content-Transfer-Encoding. This header has not been
considered a forbidden header since <https://www.w3.org/TR/2012/WD-XMLHttpRequest-20121206/>.

* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::setRequestHeader):
(WebCore::isForbiddenRequestHeader): Deleted.
(WebCore::XMLHttpRequest::isAllowedHTTPHeader): Deleted.
* xml/XMLHttpRequest.h:

LayoutTests:

Update tests and test results now that we no longer consider Content-Transfer-Encoding a
forbidden header.

* fast/xmlhttprequest/set-dangerous-headers-expected.txt:
* fast/xmlhttprequest/set-dangerous-headers-in-dashboard.html:
* fast/xmlhttprequest/set-dangerous-headers.html:
* http/tests/xmlhttprequest/set-dangerous-headers-expected.txt:
* http/tests/xmlhttprequest/set-dangerous-headers.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222807 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/xmlhttprequest/set-dangerous-headers-expected.txt
LayoutTests/fast/xmlhttprequest/set-dangerous-headers-in-dashboard.html
LayoutTests/fast/xmlhttprequest/set-dangerous-headers.html
LayoutTests/http/tests/xmlhttprequest/set-dangerous-headers-expected.txt
LayoutTests/http/tests/xmlhttprequest/set-dangerous-headers.html
Source/WebCore/ChangeLog
Source/WebCore/xml/XMLHttpRequest.cpp
Source/WebCore/xml/XMLHttpRequest.h

index 9fcacae..adcce09 100644 (file)
@@ -1,3 +1,20 @@
+2017-10-03  Daniel Bates  <dabates@apple.com>
+
+        XMLHttpRequest.setRequestHeader() should allow Content-Transfer-Encoding header; remove
+        duplicate logic to check for a forbidden XHR header field
+        https://bugs.webkit.org/show_bug.cgi?id=177829
+
+        Reviewed by Alexey Proskuryakov.
+
+        Update tests and test results now that we no longer consider Content-Transfer-Encoding a
+        forbidden header.
+
+        * fast/xmlhttprequest/set-dangerous-headers-expected.txt:
+        * fast/xmlhttprequest/set-dangerous-headers-in-dashboard.html:
+        * fast/xmlhttprequest/set-dangerous-headers.html:
+        * http/tests/xmlhttprequest/set-dangerous-headers-expected.txt:
+        * http/tests/xmlhttprequest/set-dangerous-headers.html:
+
 2017-10-03  Joseph Pecoraro  <pecoraro@apple.com>
 
         Unreviewed test gardening. Add debugging to flakey test.
index 7ae3f42..c7d2e3f 100644 (file)
@@ -4,26 +4,24 @@ CONSOLE MESSAGE: line 14: Refused to set unsafe header "ACCESS-CONTROL-REQUEST-H
 CONSOLE MESSAGE: line 15: Refused to set unsafe header "ACCESS-CONTROL-REQUEST-METHOD"
 CONSOLE MESSAGE: line 21: Refused to set unsafe header "CONNECTION"
 CONSOLE MESSAGE: line 22: Refused to set unsafe header "CONTENT-LENGTH"
-CONSOLE MESSAGE: line 23: Refused to set unsafe header "CONTENT-TRANSFER-ENCODING"
-CONSOLE MESSAGE: line 24: Refused to set unsafe header "COOKIE"
-CONSOLE MESSAGE: line 25: Refused to set unsafe header "COOKIE2"
-CONSOLE MESSAGE: line 26: Refused to set unsafe header "DATE"
-CONSOLE MESSAGE: line 27: Refused to set unsafe header "DNT"
-CONSOLE MESSAGE: line 28: Refused to set unsafe header "EXPECT"
-CONSOLE MESSAGE: line 29: Refused to set unsafe header "HOST"
-CONSOLE MESSAGE: line 30: Refused to set unsafe header "KEEP-ALIVE"
-CONSOLE MESSAGE: line 31: Refused to set unsafe header "ORIGIN"
-CONSOLE MESSAGE: line 32: Refused to set unsafe header "REFERER"
-CONSOLE MESSAGE: line 33: Refused to set unsafe header "TE"
-CONSOLE MESSAGE: line 34: Refused to set unsafe header "TRAILER"
-CONSOLE MESSAGE: line 35: Refused to set unsafe header "TRANSFER-ENCODING"
-CONSOLE MESSAGE: line 36: Refused to set unsafe header "UPGRADE"
-CONSOLE MESSAGE: line 37: Refused to set unsafe header "USER-AGENT"
-CONSOLE MESSAGE: line 38: Refused to set unsafe header "VIA"
-CONSOLE MESSAGE: line 40: Refused to set unsafe header "Proxy-"
-CONSOLE MESSAGE: line 41: Refused to set unsafe header "Proxy-test"
-CONSOLE MESSAGE: line 42: Refused to set unsafe header "PROXY-FOO"
-CONSOLE MESSAGE: line 44: Refused to set unsafe header "Sec-"
-CONSOLE MESSAGE: line 45: Refused to set unsafe header "Sec-test"
-CONSOLE MESSAGE: line 46: Refused to set unsafe header "SEC-FOO"
+CONSOLE MESSAGE: line 25: Refused to set unsafe header "COOKIE"
+CONSOLE MESSAGE: line 26: Refused to set unsafe header "COOKIE2"
+CONSOLE MESSAGE: line 27: Refused to set unsafe header "DATE"
+CONSOLE MESSAGE: line 28: Refused to set unsafe header "DNT"
+CONSOLE MESSAGE: line 29: Refused to set unsafe header "EXPECT"
+CONSOLE MESSAGE: line 30: Refused to set unsafe header "HOST"
+CONSOLE MESSAGE: line 31: Refused to set unsafe header "KEEP-ALIVE"
+CONSOLE MESSAGE: line 32: Refused to set unsafe header "ORIGIN"
+CONSOLE MESSAGE: line 33: Refused to set unsafe header "REFERER"
+CONSOLE MESSAGE: line 34: Refused to set unsafe header "TE"
+CONSOLE MESSAGE: line 35: Refused to set unsafe header "TRAILER"
+CONSOLE MESSAGE: line 36: Refused to set unsafe header "TRANSFER-ENCODING"
+CONSOLE MESSAGE: line 37: Refused to set unsafe header "UPGRADE"
+CONSOLE MESSAGE: line 39: Refused to set unsafe header "VIA"
+CONSOLE MESSAGE: line 41: Refused to set unsafe header "Proxy-"
+CONSOLE MESSAGE: line 42: Refused to set unsafe header "Proxy-test"
+CONSOLE MESSAGE: line 43: Refused to set unsafe header "PROXY-FOO"
+CONSOLE MESSAGE: line 45: Refused to set unsafe header "Sec-"
+CONSOLE MESSAGE: line 46: Refused to set unsafe header "Sec-test"
+CONSOLE MESSAGE: line 47: Refused to set unsafe header "SEC-FOO"
 Test that setRequestHeader() cannot be used to alter security-sensitive headers. This test PASSED if you see console warnings.
index 996645f..2036164 100644 (file)
@@ -22,7 +22,6 @@
     req.setRequestHeader("AUTHORIZATION", "baz");
     req.setRequestHeader("CONNECTION", "foobar");
     req.setRequestHeader("CONTENT-LENGTH", "123456");
-    req.setRequestHeader("CONTENT-TRANSFER-ENCODING", "foobar");
     req.setRequestHeader("COOKIE", "foobar");
     req.setRequestHeader("COOKIE2", "foobar");
     req.setRequestHeader("DATE", "foobar");
index 02ea7d9..eb89a51 100644 (file)
@@ -20,7 +20,6 @@
     req.setRequestHeader("AUTHORIZATION", "baz");
     req.setRequestHeader("CONNECTION", "foobar");
     req.setRequestHeader("CONTENT-LENGTH", "123456");
-    req.setRequestHeader("CONTENT-TRANSFER-ENCODING", "foobar");
     req.setRequestHeader("COOKIE", "foobar");
     req.setRequestHeader("COOKIE2", "foobar");
     req.setRequestHeader("DATE", "foobar");
index 31e82d0..a8d1c04 100644 (file)
@@ -4,28 +4,26 @@ CONSOLE MESSAGE: line 14: Refused to set unsafe header "ACCESS-CONTROL-REQUEST-H
 CONSOLE MESSAGE: line 15: Refused to set unsafe header "ACCESS-CONTROL-REQUEST-METHOD"
 CONSOLE MESSAGE: line 21: Refused to set unsafe header "CONNECTION"
 CONSOLE MESSAGE: line 22: Refused to set unsafe header "CONTENT-LENGTH"
-CONSOLE MESSAGE: line 23: Refused to set unsafe header "CONTENT-TRANSFER-ENCODING"
-CONSOLE MESSAGE: line 24: Refused to set unsafe header "COOKIE"
-CONSOLE MESSAGE: line 25: Refused to set unsafe header "COOKIE2"
-CONSOLE MESSAGE: line 26: Refused to set unsafe header "DATE"
-CONSOLE MESSAGE: line 27: Refused to set unsafe header "DNT"
-CONSOLE MESSAGE: line 28: Refused to set unsafe header "EXPECT"
-CONSOLE MESSAGE: line 29: Refused to set unsafe header "HOST"
-CONSOLE MESSAGE: line 30: Refused to set unsafe header "KEEP-ALIVE"
-CONSOLE MESSAGE: line 31: Refused to set unsafe header "ORIGIN"
-CONSOLE MESSAGE: line 32: Refused to set unsafe header "REFERER"
-CONSOLE MESSAGE: line 33: Refused to set unsafe header "TE"
-CONSOLE MESSAGE: line 34: Refused to set unsafe header "TRAILER"
-CONSOLE MESSAGE: line 35: Refused to set unsafe header "TRANSFER-ENCODING"
-CONSOLE MESSAGE: line 36: Refused to set unsafe header "UPGRADE"
-CONSOLE MESSAGE: line 37: Refused to set unsafe header "USER-AGENT"
-CONSOLE MESSAGE: line 38: Refused to set unsafe header "VIA"
-CONSOLE MESSAGE: line 40: Refused to set unsafe header "Proxy-"
-CONSOLE MESSAGE: line 41: Refused to set unsafe header "Proxy-test"
-CONSOLE MESSAGE: line 42: Refused to set unsafe header "PROXY-FOO"
-CONSOLE MESSAGE: line 44: Refused to set unsafe header "Sec-"
-CONSOLE MESSAGE: line 45: Refused to set unsafe header "Sec-test"
-CONSOLE MESSAGE: line 46: Refused to set unsafe header "SEC-FOO"
+CONSOLE MESSAGE: line 25: Refused to set unsafe header "COOKIE"
+CONSOLE MESSAGE: line 26: Refused to set unsafe header "COOKIE2"
+CONSOLE MESSAGE: line 27: Refused to set unsafe header "DATE"
+CONSOLE MESSAGE: line 28: Refused to set unsafe header "DNT"
+CONSOLE MESSAGE: line 29: Refused to set unsafe header "EXPECT"
+CONSOLE MESSAGE: line 30: Refused to set unsafe header "HOST"
+CONSOLE MESSAGE: line 31: Refused to set unsafe header "KEEP-ALIVE"
+CONSOLE MESSAGE: line 32: Refused to set unsafe header "ORIGIN"
+CONSOLE MESSAGE: line 33: Refused to set unsafe header "REFERER"
+CONSOLE MESSAGE: line 34: Refused to set unsafe header "TE"
+CONSOLE MESSAGE: line 35: Refused to set unsafe header "TRAILER"
+CONSOLE MESSAGE: line 36: Refused to set unsafe header "TRANSFER-ENCODING"
+CONSOLE MESSAGE: line 37: Refused to set unsafe header "UPGRADE"
+CONSOLE MESSAGE: line 39: Refused to set unsafe header "VIA"
+CONSOLE MESSAGE: line 41: Refused to set unsafe header "Proxy-"
+CONSOLE MESSAGE: line 42: Refused to set unsafe header "Proxy-test"
+CONSOLE MESSAGE: line 43: Refused to set unsafe header "PROXY-FOO"
+CONSOLE MESSAGE: line 45: Refused to set unsafe header "Sec-"
+CONSOLE MESSAGE: line 46: Refused to set unsafe header "Sec-test"
+CONSOLE MESSAGE: line 47: Refused to set unsafe header "SEC-FOO"
 Test that setRequestHeader cannot be used to alter security-sensitive headers.
 
 SUCCESS
index 358085e..6427b15 100644 (file)
@@ -20,7 +20,6 @@
     req.setRequestHeader("AUTHORIZATION", "baz");
     req.setRequestHeader("CONNECTION", "foobar");
     req.setRequestHeader("CONTENT-LENGTH", "123456");
-    req.setRequestHeader("CONTENT-TRANSFER-ENCODING", "foobar");
     req.setRequestHeader("COOKIE", "foobar");
     req.setRequestHeader("COOKIE2", "foobar");
     req.setRequestHeader("DATE", "foobar");
index 1ca6110..e3b37b4 100644 (file)
@@ -1,3 +1,24 @@
+2017-10-03  Daniel Bates  <dabates@apple.com>
+
+        XMLHttpRequest.setRequestHeader() should allow Content-Transfer-Encoding header; remove
+        duplicate logic to check for a forbidden XHR header field
+        https://bugs.webkit.org/show_bug.cgi?id=177829
+
+        Reviewed by Alexey Proskuryakov.
+
+        Use isForbiddenHeaderName() (defined in HTTPParsers.h) to check if the header field specified
+        to XMLHttpRequest.setRequestHeader() is allowed. Among other benefits this makes the behavior
+        of XMLHttpRequest.setRequestHeader() more closely aligned with the behavior of this method in
+        the XHR standard, <https://xhr.spec.whatwg.org> (8 September 2017). In particular, XMLHttpRequest.setRequestHeader()
+        no longer forbids setting the header Content-Transfer-Encoding. This header has not been
+        considered a forbidden header since <https://www.w3.org/TR/2012/WD-XMLHttpRequest-20121206/>.
+
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::setRequestHeader):
+        (WebCore::isForbiddenRequestHeader): Deleted.
+        (WebCore::XMLHttpRequest::isAllowedHTTPHeader): Deleted.
+        * xml/XMLHttpRequest.h:
+
 2017-10-03  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r222686, r222695, and r222698.
index 2594469..575e6fd 100644 (file)
@@ -348,56 +348,6 @@ String XMLHttpRequest::uppercaseKnownHTTPMethod(const String& method)
     return method;
 }
 
-static bool isForbiddenRequestHeader(const String& name)
-{
-    HTTPHeaderName headerName;
-    if (!findHTTPHeaderName(name, headerName))
-        return false;
-
-    switch (headerName) {
-    case HTTPHeaderName::AcceptCharset:
-    case HTTPHeaderName::AcceptEncoding:
-    case HTTPHeaderName::AccessControlRequestHeaders:
-    case HTTPHeaderName::AccessControlRequestMethod:
-    case HTTPHeaderName::Connection:
-    case HTTPHeaderName::ContentLength:
-    case HTTPHeaderName::ContentTransferEncoding:
-    case HTTPHeaderName::Cookie:
-    case HTTPHeaderName::Cookie2:
-    case HTTPHeaderName::Date:
-    case HTTPHeaderName::DNT:
-    case HTTPHeaderName::Expect:
-    case HTTPHeaderName::Host:
-    case HTTPHeaderName::KeepAlive:
-    case HTTPHeaderName::Origin:
-    case HTTPHeaderName::Referer:
-    case HTTPHeaderName::TE:
-    case HTTPHeaderName::Trailer:
-    case HTTPHeaderName::TransferEncoding:
-    case HTTPHeaderName::Upgrade:
-    case HTTPHeaderName::UserAgent:
-    case HTTPHeaderName::Via:
-        return true;
-
-    default:
-        return false;
-    }
-}
-
-bool XMLHttpRequest::isAllowedHTTPHeader(const String& name)
-{
-    if (isForbiddenRequestHeader(name))
-        return false;
-
-    if (name.startsWith("proxy-", false))
-        return false;
-
-    if (name.startsWith("sec-", false))
-        return false;
-
-    return true;
-}
-
 ExceptionOr<void> XMLHttpRequest::open(const String& method, const String& url)
 {
     // If the async argument is omitted, set async to true.
@@ -927,7 +877,7 @@ ExceptionOr<void> XMLHttpRequest::setRequestHeader(const String& name, const Str
 #if ENABLE(DASHBOARD_SUPPORT)
     allowUnsafeHeaderField = usesDashboardBackwardCompatibilityMode();
 #endif
-    if (!allowUnsafeHeaderField && !isAllowedHTTPHeader(name)) {
+    if (!allowUnsafeHeaderField && isForbiddenHeaderName(name)) {
         logConsoleError(scriptExecutionContext(), "Refused to set unsafe header \"" + name + "\"");
         return { };
     }
index 0647770..27ff879 100644 (file)
@@ -106,7 +106,6 @@ public:
     // Expose HTTP validation methods for other untrusted requests.
     static bool isAllowedHTTPMethod(const String&);
     static String uppercaseKnownHTTPMethod(const String&);
-    static bool isAllowedHTTPHeader(const String&);
 
     enum class ResponseType { EmptyString, Arraybuffer, Blob, Document, Json, Text };
     ExceptionOr<void> setResponseType(ResponseType);