Chromium Code Reviews| Index: third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp |
| diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp |
| index 3f378187b81d6e7ce58f91da81c9143e6dc3ba2b..02b719acc32b8d9cc4720624a61a3d0c5806f4dc 100644 |
| --- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp |
| +++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp |
| @@ -31,6 +31,7 @@ |
| #include "core/dom/Document.h" |
| #include "core/dom/SandboxFlags.h" |
| #include "core/events/SecurityPolicyViolationEvent.h" |
| +#include "core/fetch/IntegrityMetadata.h" |
| #include "core/frame/FrameClient.h" |
| #include "core/frame/LocalDOMWindow.h" |
| #include "core/frame/LocalFrame.h" |
| @@ -102,6 +103,9 @@ const char ContentSecurityPolicy::UpgradeInsecureRequests[] = "upgrade-insecure- |
| // https://mikewest.github.io/cors-rfc1918/#csp |
| const char ContentSecurityPolicy::TreatAsPublicAddress[] = "treat-as-public-address"; |
| +// https://w3c.github.io/webappsec-subresource-integrity/#require-sri-for |
|
Mike West
2016/06/20 08:11:37
Nit: This link doesn't work.
Sergey Shekyan
2016/06/21 06:34:51
It will once they regenerate the HTML file.
|
| +const char ContentSecurityPolicy::RequireSRIFor[] = "require-sri-for"; |
| + |
| bool ContentSecurityPolicy::isDirectiveName(const String& name) |
| { |
| return (equalIgnoringCase(name, ConnectSrc) |
| @@ -125,7 +129,8 @@ bool ContentSecurityPolicy::isDirectiveName(const String& name) |
| || equalIgnoringCase(name, ManifestSrc) |
| || equalIgnoringCase(name, BlockAllMixedContent) |
| || equalIgnoringCase(name, UpgradeInsecureRequests) |
| - || equalIgnoringCase(name, TreatAsPublicAddress)); |
| + || equalIgnoringCase(name, TreatAsPublicAddress) |
| + || equalIgnoringCase(name, RequireSRIFor)); |
| } |
| static UseCounter::Feature getUseCounterType(ContentSecurityPolicyHeaderType type) |
| @@ -560,8 +565,21 @@ bool ContentSecurityPolicy::allowStyleWithHash(const String& source, InlineType |
| return checkDigest<&CSPDirectiveList::allowStyleHash>(source, type, m_styleHashAlgorithmsUsed, m_policies); |
| } |
| -bool ContentSecurityPolicy::allowRequest(WebURLRequest::RequestContext context, const KURL& url, const String& nonce, RedirectStatus redirectStatus, ReportingStatus reportingStatus) const |
| +bool ContentSecurityPolicy::allowRequestWithoutIntegrity(WebURLRequest::RequestContext context, const KURL& url, RedirectStatus redirectStatus, ContentSecurityPolicy::ReportingStatus reportingStatus) const |
| +{ |
| + for (const auto& policy : m_policies) { |
| + if (!policy->allowRequestWithoutIntegrity(context, url, redirectStatus, reportingStatus)) |
| + return false; |
| + } |
| + return true; |
| +} |
| + |
| +bool ContentSecurityPolicy::allowRequest(WebURLRequest::RequestContext context, const KURL& url, const String& nonce, const IntegrityMetadataSet& integrityMetadata, RedirectStatus redirectStatus, ReportingStatus reportingStatus) const |
| { |
| + if (integrityMetadata.isEmpty() |
| + && !allowRequestWithoutIntegrity(context, url, redirectStatus, reportingStatus)) |
| + return false; |
| + |
| switch (context) { |
| case WebURLRequest::RequestContextAudio: |
| case WebURLRequest::RequestContextTrack: |
| @@ -588,6 +606,7 @@ bool ContentSecurityPolicy::allowRequest(WebURLRequest::RequestContext context, |
| return allowChildFrameFromSource(url, redirectStatus, reportingStatus); |
| case WebURLRequest::RequestContextImport: |
| case WebURLRequest::RequestContextScript: |
| + return allowScriptFromSource(url, nonce, redirectStatus, reportingStatus); |
| case WebURLRequest::RequestContextXSLT: |
| return allowScriptFromSource(url, nonce, redirectStatus, reportingStatus); |
| case WebURLRequest::RequestContextManifest: |
| @@ -996,6 +1015,11 @@ void ContentSecurityPolicy::reportInvalidReflectedXSS(const String& invalidValue |
| logToConsole("The 'reflected-xss' Content Security Policy directive has the invalid value \"" + invalidValue + "\". Valid values are \"allow\", \"filter\", and \"block\"."); |
| } |
| +void ContentSecurityPolicy::reportInvalidRequireSRIForTokens(const String& invalidTokens) |
| +{ |
| + logToConsole("Error while parsing the 'require-sri-for' Content Security Policy directive: " + invalidTokens); |
| +} |
| + |
| void ContentSecurityPolicy::reportInvalidDirectiveValueCharacter(const String& directiveName, const String& value) |
| { |
| String message = "The value for Content Security Policy directive '" + directiveName + "' contains an invalid character: '" + value + "'. Non-whitespace characters outside ASCII 0x21-0x7E must be percent-encoded, as described in RFC 3986, section 2.1: http://tools.ietf.org/html/rfc3986#section-2.1."; |