Title: [92142] trunk
Revision
92142
Author
joc...@chromium.org
Date
2011-08-01 14:18:49 -0700 (Mon, 01 Aug 2011)

Log Message

Source/WebCore: Never override the policy URL on form submissions.
https://bugs.webkit.org/show_bug.cgi?id=61809

Reviewed by Adam Barth.

Tests: http/tests/security/cookies/third-party-cookie-blocking-main-frame.html
       http/tests/security/cookies/third-party-cookie-blocking-user-action.html
       http/tests/security/cookies/third-party-cookie-blocking.html

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::loadURL):
(WebCore::FrameLoader::addExtraFieldsToSubresourceRequest):
(WebCore::FrameLoader::addExtraFieldsToMainResourceRequest):
(WebCore::FrameLoader::addExtraFieldsToRequest):
(WebCore::FrameLoader::loadPostRequest):
(WebCore::FrameLoader::loadDifferentDocumentItem):
* loader/FrameLoader.h:

LayoutTests: Require explicit user action to override the policy URL on form submissions.
https://bugs.webkit.org/show_bug.cgi?id=61809

Reviewed by Adam Barth.

* http/tests/loading/redirect-methods-expected.txt:
* http/tests/security/cookies/resources/set-a-cookie.php: Added.
* http/tests/security/cookies/third-party-cookie-blocking-expected.txt: Added.
* http/tests/security/cookies/third-party-cookie-blocking-main-frame-expected.txt: Added.
* http/tests/security/cookies/third-party-cookie-blocking-main-frame.html: Added.
* http/tests/security/cookies/third-party-cookie-blocking-user-action-expected.txt: Added.
* http/tests/security/cookies/third-party-cookie-blocking-user-action.html: Added.
* http/tests/security/cookies/third-party-cookie-blocking.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (92141 => 92142)


--- trunk/LayoutTests/ChangeLog	2011-08-01 21:16:33 UTC (rev 92141)
+++ trunk/LayoutTests/ChangeLog	2011-08-01 21:18:49 UTC (rev 92142)
@@ -1,3 +1,19 @@
+2011-08-01  Jochen Eisinger  <joc...@chromium.org>
+
+        Require explicit user action to override the policy URL on form submissions.
+        https://bugs.webkit.org/show_bug.cgi?id=61809
+
+        Reviewed by Adam Barth.
+
+        * http/tests/loading/redirect-methods-expected.txt:
+        * http/tests/security/cookies/resources/set-a-cookie.php: Added.
+        * http/tests/security/cookies/third-party-cookie-blocking-expected.txt: Added.
+        * http/tests/security/cookies/third-party-cookie-blocking-main-frame-expected.txt: Added.
+        * http/tests/security/cookies/third-party-cookie-blocking-main-frame.html: Added.
+        * http/tests/security/cookies/third-party-cookie-blocking-user-action-expected.txt: Added.
+        * http/tests/security/cookies/third-party-cookie-blocking-user-action.html: Added.
+        * http/tests/security/cookies/third-party-cookie-blocking.html: Added.
+
 2011-08-01  Anna Cavender  <ann...@chromium.org>
 
         media/track tests should be skipped on all platforms until feature is fully implemented.

Modified: trunk/LayoutTests/http/tests/loading/redirect-methods-expected.txt (92141 => 92142)


--- trunk/LayoutTests/http/tests/loading/redirect-methods-expected.txt	2011-08-01 21:16:33 UTC (rev 92141)
+++ trunk/LayoutTests/http/tests/loading/redirect-methods-expected.txt	2011-08-01 21:18:49 UTC (rev 92142)
@@ -24,8 +24,8 @@
 frame "0" - didFinishLoadForFrame
 http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didFinishLoading
 frame "0" - didStartProvisionalLoadForFrame
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http method POST> redirectResponse (null)
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, main document URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http status code 301>
+http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method POST> redirectResponse (null)
+http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http status code 301>
 frame "0" - didReceiveServerRedirectForProvisionalLoadForFrame
 http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, http status code 200>
 frame "0" - didCancelClientRedirectForFrame
@@ -54,8 +54,8 @@
 frame "1" - didFinishLoadForFrame
 http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didFinishLoading
 frame "1" - didStartProvisionalLoadForFrame
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http method POST> redirectResponse (null)
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, main document URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http status code 302>
+http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method POST> redirectResponse (null)
+http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http status code 302>
 frame "1" - didReceiveServerRedirectForProvisionalLoadForFrame
 http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, http status code 200>
 frame "1" - didCancelClientRedirectForFrame
@@ -84,8 +84,8 @@
 frame "2" - didFinishLoadForFrame
 http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didFinishLoading
 frame "2" - didStartProvisionalLoadForFrame
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http method POST> redirectResponse (null)
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, main document URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http status code 303>
+http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method POST> redirectResponse (null)
+http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http status code 303>
 frame "2" - didReceiveServerRedirectForProvisionalLoadForFrame
 http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, http status code 200>
 frame "2" - didCancelClientRedirectForFrame
@@ -114,8 +114,8 @@
 frame "3" - didFinishLoadForFrame
 http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didFinishLoading
 frame "3" - didStartProvisionalLoadForFrame
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http method POST> redirectResponse (null)
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, main document URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http method POST> redirectResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http status code 307>
+http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method POST> redirectResponse (null)
+http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method POST> redirectResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, http status code 307>
 frame "3" - didReceiveServerRedirectForProvisionalLoadForFrame
 http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, http status code 200>
 frame "3" - didCancelClientRedirectForFrame

Added: trunk/LayoutTests/http/tests/security/cookies/resources/set-a-cookie.php (0 => 92142)


--- trunk/LayoutTests/http/tests/security/cookies/resources/set-a-cookie.php	                        (rev 0)
+++ trunk/LayoutTests/http/tests/security/cookies/resources/set-a-cookie.php	2011-08-01 21:18:49 UTC (rev 92142)
@@ -0,0 +1,22 @@
+<?php
+    setcookie("test_cookie", "1", 0, "/");
+?>
+<!DOCTYPE html>
+<html>
+<script>
+function checkCookie()
+{
+    if (document.cookie.indexOf("test_cookie=1") < 0)
+        document.getElementById("log").innerHTML += "Cookie is NOT set";
+    else
+        document.getElementById("log").innerHTML += "Cookie is set";
+    document.cookie = "test_cookie=0; path=/; expires=Thu, 01-Jan-1970 00:00:01 GMT";
+
+    if (window.layoutTestController)
+        layoutTestController.notifyDone();
+}
+</script>
+<body _onload_="checkCookie()">
+<div id="log"></div>
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-expected.txt (0 => 92142)


--- trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-expected.txt	2011-08-01 21:18:49 UTC (rev 92142)
@@ -0,0 +1,7 @@
+
+
+
+--------
+Frame: 'iframe'
+--------
+Cookie is NOT set

Added: trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-main-frame-expected.txt (0 => 92142)


--- trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-main-frame-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-main-frame-expected.txt	2011-08-01 21:18:49 UTC (rev 92142)
@@ -0,0 +1 @@
+Cookie is set

Added: trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-main-frame.html (0 => 92142)


--- trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-main-frame.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-main-frame.html	2011-08-01 21:18:49 UTC (rev 92142)
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<title>Checks that a POST resulting in a main frame navigation is not affected by third-party cookie rules</title>
+<script>
+if (window.layoutTestController) {
+    layoutTestController.waitUntilDone();
+    layoutTestController.dumpAsText();
+    layoutTestController.dumpChildFramesAsText();
+    layoutTestController.setAlwaysAcceptCookies(false);
+}
+
+function runTest()
+{
+    document.getElementById('form').submit();
+}
+</script>
+<body _onload_="runTest()">
+    <div>
+        <form id="form" action="" method="POST">
+          <input type="submit" />
+        </form>
+        <iframe src="" name="iframe"></iframe>
+    </div>
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-user-action-expected.txt (0 => 92142)


--- trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-user-action-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-user-action-expected.txt	2011-08-01 21:18:49 UTC (rev 92142)
@@ -0,0 +1,7 @@
+
+
+
+--------
+Frame: 'iframe'
+--------
+Cookie is NOT set

Added: trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-user-action.html (0 => 92142)


--- trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-user-action.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking-user-action.html	2011-08-01 21:18:49 UTC (rev 92142)
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<title>Checks that a user generated POST request does not circumvent third-party cookie rules</title>
+<script>
+if (window.layoutTestController) {
+    layoutTestController.waitUntilDone();
+    layoutTestController.dumpAsText();
+    layoutTestController.dumpChildFramesAsText();
+    layoutTestController.setAlwaysAcceptCookies(false);
+}
+
+function runTest()
+{
+    if (window.eventSender) {
+        // Click somewhere on the button!
+        var form = document.getElementById("form");
+        eventSender.mouseMoveTo(form.offsetLeft + 5, form.offsetTop + 5);
+        eventSender.mouseDown();
+        eventSender.mouseUp();
+    }
+}
+</script>
+<body _onload_="runTest()">
+    <div>
+        <form id="form" action="" method="POST" target="iframe">
+          <input type="submit" />
+        </form>
+        <iframe src="" name="iframe"></iframe>
+    </div>
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking.html (0 => 92142)


--- trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/security/cookies/third-party-cookie-blocking.html	2011-08-01 21:18:49 UTC (rev 92142)
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<title>Checks that a script generated POST request does not circumvent third-party cookie rules</title>
+<script>
+if (window.layoutTestController) {
+    layoutTestController.waitUntilDone();
+    layoutTestController.dumpAsText();
+    layoutTestController.dumpChildFramesAsText();
+    layoutTestController.setAlwaysAcceptCookies(false);
+}
+
+function runTest()
+{
+    document.getElementById('form').submit();
+}
+</script>
+<body _onload_="runTest()">
+    <div>
+        <form id="form" action="" method="POST" target="iframe">
+          <input type="submit" />
+        </form>
+        <iframe src="" name="iframe"></iframe>
+    </div>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (92141 => 92142)


--- trunk/Source/WebCore/ChangeLog	2011-08-01 21:16:33 UTC (rev 92141)
+++ trunk/Source/WebCore/ChangeLog	2011-08-01 21:18:49 UTC (rev 92142)
@@ -1,3 +1,24 @@
+2011-08-01  Jochen Eisinger  <joc...@chromium.org>
+
+        Never override the policy URL on form submissions.
+        https://bugs.webkit.org/show_bug.cgi?id=61809
+
+        Reviewed by Adam Barth.
+
+        Tests: http/tests/security/cookies/third-party-cookie-blocking-main-frame.html
+               http/tests/security/cookies/third-party-cookie-blocking-user-action.html
+               http/tests/security/cookies/third-party-cookie-blocking.html
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::loadURL):
+        (WebCore::FrameLoader::addExtraFieldsToSubresourceRequest):
+        (WebCore::FrameLoader::addExtraFieldsToMainResourceRequest):
+        (WebCore::FrameLoader::addExtraFieldsToRequest):
+        (WebCore::FrameLoader::loadPostRequest):
+        (WebCore::FrameLoader::loadDifferentDocumentItem):
+        * loader/FrameLoader.h:
+
+
 2011-08-01  Ryosuke Niwa  <rn...@webkit.org>
 
         Update comment added in r92139 per Darin's suggestion.

Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (92141 => 92142)


--- trunk/Source/WebCore/loader/FrameLoader.cpp	2011-08-01 21:16:33 UTC (rev 92141)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp	2011-08-01 21:18:49 UTC (rev 92142)
@@ -1175,7 +1175,7 @@
         RefPtr<SecurityOrigin> referrerOrigin = SecurityOrigin::createFromString(referrer);
         addHTTPOriginIfNeeded(request, referrerOrigin->toString());
     }
-    addExtraFieldsToRequest(request, newLoadType, true, event || isFormSubmission);
+    addExtraFieldsToRequest(request, newLoadType, true);
     if (newLoadType == FrameLoadTypeReload || newLoadType == FrameLoadTypeReloadFromOrigin)
         request.setCachePolicy(ReloadIgnoringCacheData);
 
@@ -2437,20 +2437,20 @@
     
 void FrameLoader::addExtraFieldsToSubresourceRequest(ResourceRequest& request)
 {
-    addExtraFieldsToRequest(request, m_loadType, false, false);
+    addExtraFieldsToRequest(request, m_loadType, false);
 }
 
 void FrameLoader::addExtraFieldsToMainResourceRequest(ResourceRequest& request)
 {
-    addExtraFieldsToRequest(request, m_loadType, true, false);
+    addExtraFieldsToRequest(request, m_loadType, true);
 }
 
-void FrameLoader::addExtraFieldsToRequest(ResourceRequest& request, FrameLoadType loadType, bool mainResource, bool cookiePolicyURLFromRequest)
+void FrameLoader::addExtraFieldsToRequest(ResourceRequest& request, FrameLoadType loadType, bool mainResource)
 {
     // Don't set the cookie policy URL if it's already been set.
     // But make sure to set it on all requests, as it has significance beyond the cookie policy for all protocols (<rdar://problem/6616664>).
     if (request.firstPartyForCookies().isEmpty()) {
-        if (mainResource && (isLoadingMainFrame() || cookiePolicyURLFromRequest))
+        if (mainResource && isLoadingMainFrame())
             request.setFirstPartyForCookies(request.url());
         else if (Document* document = m_frame->document())
             request.setFirstPartyForCookies(document->firstPartyForCookies());
@@ -2550,7 +2550,7 @@
     workingResourceRequest.setHTTPMethod("POST");
     workingResourceRequest.setHTTPBody(formData);
     workingResourceRequest.setHTTPContentType(contentType);
-    addExtraFieldsToRequest(workingResourceRequest, loadType, true, true);
+    addExtraFieldsToRequest(workingResourceRequest, loadType, true);
 
     NavigationAction action(url, loadType, true, event);
 
@@ -3024,7 +3024,7 @@
 
         // Make sure to add extra fields to the request after the Origin header is added for the FormData case.
         // See https://bugs.webkit.org/show_bug.cgi?id=22194 for more discussion.
-        addExtraFieldsToRequest(request, m_loadType, true, formData);
+        addExtraFieldsToRequest(request, m_loadType, true);
         addedExtraFields = true;
         
         // FIXME: Slight hack to test if the NSURL cache contains the page we're going to.
@@ -3067,7 +3067,7 @@
     }
     
     if (!addedExtraFields)
-        addExtraFieldsToRequest(request, m_loadType, true, formData);
+        addExtraFieldsToRequest(request, m_loadType, true);
 
     loadWithNavigationAction(request, action, false, loadType, 0);
 }

Modified: trunk/Source/WebCore/loader/FrameLoader.h (92141 => 92142)


--- trunk/Source/WebCore/loader/FrameLoader.h	2011-08-01 21:16:33 UTC (rev 92141)
+++ trunk/Source/WebCore/loader/FrameLoader.h	2011-08-01 21:18:49 UTC (rev 92142)
@@ -301,7 +301,7 @@
     void updateFirstPartyForCookies();
     void setFirstPartyForCookies(const KURL&);
     
-    void addExtraFieldsToRequest(ResourceRequest&, FrameLoadType loadType, bool isMainResource, bool cookiePolicyURLFromRequest);
+    void addExtraFieldsToRequest(ResourceRequest&, FrameLoadType, bool isMainResource);
 
     void clearProvisionalLoad();
     void transitionToCommitted(PassRefPtr<CachedPage>);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to