Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: third_party/WebKit/Source/core/loader/FrameLoader.cpp

Issue 2557063002: Upgrade Insecure Requests: bugfixes, tests, and support for OOPIF.
Patch Set: Upgrade Insecure Requests: bugfixes, tests, and support for OOPIF. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 4 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
5 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. 5 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved.
6 * (http://www.torchmobile.com/) 6 * (http://www.torchmobile.com/)
7 * Copyright (C) 2008 Alp Toker <alp@atoker.com> 7 * Copyright (C) 2008 Alp Toker <alp@atoker.com>
8 * Copyright (C) Research In Motion Limited 2009. All rights reserved. 8 * Copyright (C) Research In Motion Limited 2009. All rights reserved.
9 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> 9 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com>
10 * Copyright (C) 2011 Google Inc. All rights reserved. 10 * Copyright (C) 2011 Google Inc. All rights reserved.
(...skipping 1654 matching lines...) Expand 10 before | Expand all | Expand 10 after
1665 frameLoadRequest.triggeringEvent()); 1665 frameLoadRequest.triggeringEvent());
1666 resourceRequest.setRequestContext( 1666 resourceRequest.setRequestContext(
1667 determineRequestContextFromNavigationType(navigationType)); 1667 determineRequestContextFromNavigationType(navigationType));
1668 resourceRequest.setFrameType(m_frame->isMainFrame() 1668 resourceRequest.setFrameType(m_frame->isMainFrame()
1669 ? WebURLRequest::FrameTypeTopLevel 1669 ? WebURLRequest::FrameTypeTopLevel
1670 : WebURLRequest::FrameTypeNested); 1670 : WebURLRequest::FrameTypeNested);
1671 1671
1672 // Record the latest requiredCSP value that will be used when sending this 1672 // Record the latest requiredCSP value that will be used when sending this
1673 // request. 1673 // request.
1674 recordLatestRequiredCSP(); 1674 recordLatestRequiredCSP();
1675 modifyRequestForCSP(resourceRequest, nullptr); 1675 modifyRequestForCSP(resourceRequest, frameLoadRequest.originDocument());
arthursonzogni 2016/12/07 13:51:26 This line makes Upgrade Insecure Requests works wi
1676 if (!shouldContinueForNavigationPolicy( 1676 if (!shouldContinueForNavigationPolicy(
1677 resourceRequest, frameLoadRequest.substituteData(), nullptr, 1677 resourceRequest, frameLoadRequest.substituteData(), nullptr,
1678 frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), 1678 frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(),
1679 navigationType, navigationPolicy, 1679 navigationType, navigationPolicy,
1680 type == FrameLoadTypeReplaceCurrentItem, 1680 type == FrameLoadTypeReplaceCurrentItem,
1681 frameLoadRequest.clientRedirect() == 1681 frameLoadRequest.clientRedirect() ==
1682 ClientRedirectPolicy::ClientRedirect, 1682 ClientRedirectPolicy::ClientRedirect,
1683 frameLoadRequest.form())) 1683 frameLoadRequest.form()))
1684 return; 1684 return;
1685 1685
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1860 return parentFrame->securityContext()->getInsecureRequestPolicy(); 1860 return parentFrame->securityContext()->getInsecureRequestPolicy();
1861 } 1861 }
1862 1862
1863 SecurityContext::InsecureNavigationsSet* 1863 SecurityContext::InsecureNavigationsSet*
1864 FrameLoader::insecureNavigationsToUpgrade() const { 1864 FrameLoader::insecureNavigationsToUpgrade() const {
1865 DCHECK(m_frame); 1865 DCHECK(m_frame);
1866 Frame* parentFrame = m_frame->tree().parent(); 1866 Frame* parentFrame = m_frame->tree().parent();
1867 if (!parentFrame) 1867 if (!parentFrame)
1868 return nullptr; 1868 return nullptr;
1869 1869
1870 // FIXME: We need a way to propagate insecure requests policy flags to 1870 return parentFrame->securityContext()->insecureNavigationsToUpgrade();
1871 // out-of-process frames. For now, we'll always use default behavior.
1872 if (!parentFrame->isLocalFrame())
1873 return nullptr;
1874
1875 DCHECK(toLocalFrame(parentFrame)->document());
1876 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade();
1877 } 1871 }
1878 1872
1879 void FrameLoader::modifyRequestForCSP(ResourceRequest& resourceRequest, 1873 void FrameLoader::modifyRequestForCSP(ResourceRequest& resourceRequest,
1880 Document* document) const { 1874 Document* originDocument) const {
1881 if (RuntimeEnabledFeatures::embedderCSPEnforcementEnabled() && 1875 if (RuntimeEnabledFeatures::embedderCSPEnforcementEnabled() &&
1882 !requiredCSP().isEmpty()) { 1876 !requiredCSP().isEmpty()) {
1883 // TODO(amalika): Strengthen this DCHECK that requiredCSP has proper format 1877 // TODO(amalika): Strengthen this DCHECK that requiredCSP has proper format
1884 DCHECK(requiredCSP().getString().containsOnlyASCII()); 1878 DCHECK(requiredCSP().getString().containsOnlyASCII());
1885 resourceRequest.setHTTPHeaderField(HTTPNames::Embedding_CSP, requiredCSP()); 1879 resourceRequest.setHTTPHeaderField(HTTPNames::Embedding_CSP, requiredCSP());
1886 } 1880 }
1887 1881
1888 // Tack an 'Upgrade-Insecure-Requests' header to outgoing navigational 1882 // Tack an 'Upgrade-Insecure-Requests' header to outgoing navigational
1889 // requests, as described in 1883 // requests, as described in
1890 // https://w3c.github.io/webappsec/specs/upgrade/#feature-detect 1884 // https://w3c.github.io/webappsec/specs/upgrade/#feature-detect
1891 if (resourceRequest.frameType() != WebURLRequest::FrameTypeNone) { 1885 if (resourceRequest.frameType() != WebURLRequest::FrameTypeNone) {
1892 // Early return if the request has already been upgraded. 1886 // Early return if the request has already been upgraded.
1893 if (!resourceRequest.httpHeaderField(HTTPNames::Upgrade_Insecure_Requests) 1887 if (!resourceRequest.httpHeaderField(HTTPNames::Upgrade_Insecure_Requests)
1894 .isNull()) { 1888 .isNull()) {
1895 return; 1889 return;
1896 } 1890 }
1897 1891
1898 resourceRequest.setHTTPHeaderField(HTTPNames::Upgrade_Insecure_Requests, 1892 resourceRequest.setHTTPHeaderField(HTTPNames::Upgrade_Insecure_Requests,
1899 "1"); 1893 "1");
1900 } 1894 }
1901 1895
1902 upgradeInsecureRequest(resourceRequest, document); 1896 upgradeInsecureRequest(resourceRequest, originDocument);
1903 } 1897 }
1904 1898
1905 void FrameLoader::upgradeInsecureRequest(ResourceRequest& resourceRequest, 1899 void FrameLoader::upgradeInsecureRequest(ResourceRequest& resourceRequest,
1906 Document* document) const { 1900 Document* originDocument) const {
1901 // We always upgrade requests that meet any of the following criteria:
1902 //
1903 // Enforced in FrameLoader::upgradeInsecureRequest.
1904 // 1. Are for subresources.
1905 // 2. Are for nested frames.
1906 // 3. Are form submissions.
1907 // 4. Whose hosts are contained in the originDocument's upgrade insecure
1908 // navigations set. (same-frame navigation).
1909 // Enforced in Frame::upgradeInsecureRequest.
1910 // 4. Whose hosts are contained in the originDocument's upgrade insecure
1911 // navigations set. (cross-frame navigation).
1912
1907 KURL url = resourceRequest.url(); 1913 KURL url = resourceRequest.url();
1908 1914
1909 // If we don't yet have an |m_document| (because we're loading an iframe, for 1915 // If we don't yet have an |originDocument| (because we're loading an iframe,
1910 // instance), check the FrameLoader's policy. 1916 // for instance), check the FrameLoader's policy.
1911 WebInsecureRequestPolicy relevantPolicy = 1917 WebInsecureRequestPolicy relevantPolicy =
1912 document ? document->getInsecureRequestPolicy() 1918 originDocument ? originDocument->getInsecureRequestPolicy()
1913 : getInsecureRequestPolicy(); 1919 : getInsecureRequestPolicy();
1914 SecurityContext::InsecureNavigationsSet* relevantNavigationSet = 1920 SecurityContext::InsecureNavigationsSet* relevantNavigationSet =
1915 document ? document->insecureNavigationsToUpgrade() 1921 originDocument ? originDocument->insecureNavigationsToUpgrade()
1916 : insecureNavigationsToUpgrade(); 1922 : insecureNavigationsToUpgrade();
1917 1923
1918 if (url.protocolIs("http") && relevantPolicy & kUpgradeInsecureRequests) { 1924 if (url.protocolIs("http") && relevantPolicy & kUpgradeInsecureRequests) {
1919 // We always upgrade requests that meet any of the following criteria:
1920 //
1921 // 1. Are for subresources (including nested frames).
1922 // 2. Are form submissions.
1923 // 3. Whose hosts are contained in the document's InsecureNavigationSet.
1924 if (resourceRequest.frameType() == WebURLRequest::FrameTypeNone || 1925 if (resourceRequest.frameType() == WebURLRequest::FrameTypeNone ||
1925 resourceRequest.frameType() == WebURLRequest::FrameTypeNested || 1926 resourceRequest.frameType() == WebURLRequest::FrameTypeNested ||
1926 resourceRequest.requestContext() == WebURLRequest::RequestContextForm || 1927 resourceRequest.requestContext() == WebURLRequest::RequestContextForm ||
1927 (!url.host().isNull() && 1928 (!url.host().isNull() &&
1928 relevantNavigationSet->contains(url.host().impl()->hash()))) { 1929 relevantNavigationSet->contains(url.host().impl()->hash()))) {
1929 UseCounter::count(document, 1930 UseCounter::count(originDocument,
1930 UseCounter::UpgradeInsecureRequestsUpgradedRequest); 1931 UseCounter::UpgradeInsecureRequestsUpgradedRequest);
1931 url.setProtocol("https"); 1932 url.setProtocol("https");
1932 if (url.port() == 80) 1933 if (url.port() == 80)
1933 url.setPort(443); 1934 url.setPort(443);
1934 resourceRequest.setURL(url); 1935 resourceRequest.setURL(url);
1935 } 1936 }
1936 } 1937 }
1937 } 1938 }
1938 1939
1939 void FrameLoader::recordLatestRequiredCSP() { 1940 void FrameLoader::recordLatestRequiredCSP() {
(...skipping 19 matching lines...) Expand all
1959 m_documentLoader ? m_documentLoader->url() : String()); 1960 m_documentLoader ? m_documentLoader->url() : String());
1960 return tracedValue; 1961 return tracedValue;
1961 } 1962 }
1962 1963
1963 inline void FrameLoader::takeObjectSnapshot() const { 1964 inline void FrameLoader::takeObjectSnapshot() const {
1964 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this, 1965 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this,
1965 toTracedValue()); 1966 toTracedValue());
1966 } 1967 }
1967 1968
1968 } // namespace blink 1969 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698