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

Side by Side Diff: third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp

Issue 2002943002: CSP violation reports should report the pre-redirect URL. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 6 months 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 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/frame/csp/CSPDirectiveList.h" 5 #include "core/frame/csp/CSPDirectiveList.h"
6 6
7 #include "core/dom/Document.h" 7 #include "core/dom/Document.h"
8 #include "core/dom/SecurityContext.h" 8 #include "core/dom/SecurityContext.h"
9 #include "core/dom/SpaceSplitString.h" 9 #include "core/dom/SpaceSplitString.h"
10 #include "core/frame/LocalFrame.h" 10 #include "core/frame/LocalFrame.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 String message = "Refused to evaluate a string as JavaScript because 'un safe-eval' is not an allowed source of script in the following Content Security Policy directive: \"" + directives->operativeDirective(directives->m_scriptSrc.g et())->text() + "\".\n"; 67 String message = "Refused to evaluate a string as JavaScript because 'un safe-eval' is not an allowed source of script in the following Content Security Policy directive: \"" + directives->operativeDirective(directives->m_scriptSrc.g et())->text() + "\".\n";
68 directives->setEvalDisabledErrorMessage(message); 68 directives->setEvalDisabledErrorMessage(message);
69 } 69 }
70 70
71 if (directives->isReportOnly() && source != ContentSecurityPolicyHeaderSourc eMeta && directives->reportEndpoints().isEmpty()) 71 if (directives->isReportOnly() && source != ContentSecurityPolicyHeaderSourc eMeta && directives->reportEndpoints().isEmpty())
72 policy->reportMissingReportURI(String(begin, end - begin)); 72 policy->reportMissingReportURI(String(begin, end - begin));
73 73
74 return directives; 74 return directives;
75 } 75 }
76 76
77 void CSPDirectiveList::reportViolation(const String& directiveText, const String & effectiveDirective, const String& consoleMessage, const KURL& blockedURL) cons t 77 void CSPDirectiveList::reportViolation(const String& directiveText, const String & effectiveDirective, const String& consoleMessage, const KURL& blockedURL, Reso urceRequest::RedirectStatus redirectStatus) const
78 { 78 {
79 String message = m_reportOnly ? "[Report Only] " + consoleMessage : consoleM essage; 79 String message = m_reportOnly ? "[Report Only] " + consoleMessage : consoleM essage;
80 m_policy->logToConsole(ConsoleMessage::create(SecurityMessageSource, ErrorMe ssageLevel, message)); 80 m_policy->logToConsole(ConsoleMessage::create(SecurityMessageSource, ErrorMe ssageLevel, message));
81 m_policy->reportViolation(directiveText, effectiveDirective, message, blocke dURL, m_reportEndpoints, m_header, ContentSecurityPolicy::URLViolation); 81 m_policy->reportViolation(directiveText, effectiveDirective, message, blocke dURL, m_reportEndpoints, m_header, ContentSecurityPolicy::URLViolation, nullptr, redirectStatus);
82 } 82 }
83 83
84 void CSPDirectiveList::reportViolationWithFrame(const String& directiveText, con st String& effectiveDirective, const String& consoleMessage, const KURL& blocked URL, LocalFrame* frame) const 84 void CSPDirectiveList::reportViolationWithFrame(const String& directiveText, con st String& effectiveDirective, const String& consoleMessage, const KURL& blocked URL, LocalFrame* frame) const
85 { 85 {
86 String message = m_reportOnly ? "[Report Only] " + consoleMessage : consoleM essage; 86 String message = m_reportOnly ? "[Report Only] " + consoleMessage : consoleM essage;
87 m_policy->logToConsole(ConsoleMessage::create(SecurityMessageSource, ErrorMe ssageLevel, message), frame); 87 m_policy->logToConsole(ConsoleMessage::create(SecurityMessageSource, ErrorMe ssageLevel, message), frame);
88 m_policy->reportViolation(directiveText, effectiveDirective, message, blocke dURL, m_reportEndpoints, m_header, ContentSecurityPolicy::URLViolation, frame); 88 m_policy->reportViolation(directiveText, effectiveDirective, message, blocke dURL, m_reportEndpoints, m_header, ContentSecurityPolicy::URLViolation, frame);
89 } 89 }
90 90
91 void CSPDirectiveList::reportViolationWithLocation(const String& directiveText, const String& effectiveDirective, const String& consoleMessage, const KURL& bloc kedURL, const String& contextURL, const WTF::OrdinalNumber& contextLine) const 91 void CSPDirectiveList::reportViolationWithLocation(const String& directiveText, const String& effectiveDirective, const String& consoleMessage, const KURL& bloc kedURL, const String& contextURL, const WTF::OrdinalNumber& contextLine) const
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 bool CSPDirectiveList::checkHashedAttributes(SourceListDirective* directive) con st 132 bool CSPDirectiveList::checkHashedAttributes(SourceListDirective* directive) con st
133 { 133 {
134 return !directive || directive->allowHashedAttributes(); 134 return !directive || directive->allowHashedAttributes();
135 } 135 }
136 136
137 bool CSPDirectiveList::checkDynamic(SourceListDirective* directive) const 137 bool CSPDirectiveList::checkDynamic(SourceListDirective* directive) const
138 { 138 {
139 return !directive || directive->allowDynamic(); 139 return !directive || directive->allowDynamic();
140 } 140 }
141 141
142 void CSPDirectiveList::reportMixedContent(const KURL& mixedURL) const 142 void CSPDirectiveList::reportMixedContent(const KURL& mixedURL, ResourceRequest: :RedirectStatus redirectStatus) const
143 { 143 {
144 if (strictMixedContentChecking()) 144 if (strictMixedContentChecking())
145 m_policy->reportViolation(ContentSecurityPolicy::BlockAllMixedContent, C ontentSecurityPolicy::BlockAllMixedContent, String(), mixedURL, m_reportEndpoint s, m_header, ContentSecurityPolicy::URLViolation); 145 m_policy->reportViolation(ContentSecurityPolicy::BlockAllMixedContent, C ontentSecurityPolicy::BlockAllMixedContent, String(), mixedURL, m_reportEndpoint s, m_header, ContentSecurityPolicy::URLViolation, nullptr, redirectStatus);
146 } 146 }
147 147
148 bool CSPDirectiveList::checkSource(SourceListDirective* directive, const KURL& u rl, ResourceRequest::RedirectStatus redirectStatus) const 148 bool CSPDirectiveList::checkSource(SourceListDirective* directive, const KURL& u rl, ResourceRequest::RedirectStatus redirectStatus) const
149 { 149 {
150 // If |url| is empty, fall back to the policy URL to ensure that <object>'s 150 // If |url| is empty, fall back to the policy URL to ensure that <object>'s
151 // without a `src` can be blocked/allowed, as they can still load plugins 151 // without a `src` can be blocked/allowed, as they can still load plugins
152 // even though they don't actually have a URL. 152 // even though they don't actually have a URL.
153 return !directive || directive->allows(url.isEmpty() ? m_policy->url() : url , redirectStatus); 153 return !directive || directive->allows(url.isEmpty() ? m_policy->url() : url , redirectStatus);
154 } 154 }
155 155
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 210
211 bool CSPDirectiveList::checkMediaTypeAndReportViolation(MediaListDirective* dire ctive, const String& type, const String& typeAttribute, const String& consoleMes sage) const 211 bool CSPDirectiveList::checkMediaTypeAndReportViolation(MediaListDirective* dire ctive, const String& type, const String& typeAttribute, const String& consoleMes sage) const
212 { 212 {
213 if (checkMediaType(directive, type, typeAttribute)) 213 if (checkMediaType(directive, type, typeAttribute))
214 return true; 214 return true;
215 215
216 String message = consoleMessage + "\'" + directive->text() + "\'."; 216 String message = consoleMessage + "\'" + directive->text() + "\'.";
217 if (typeAttribute.isEmpty()) 217 if (typeAttribute.isEmpty())
218 message = message + " When enforcing the 'plugin-types' directive, the p lugin's media type must be explicitly declared with a 'type' attribute on the co ntaining element (e.g. '<object type=\"[TYPE GOES HERE]\" ...>')."; 218 message = message + " When enforcing the 'plugin-types' directive, the p lugin's media type must be explicitly declared with a 'type' attribute on the co ntaining element (e.g. '<object type=\"[TYPE GOES HERE]\" ...>').";
219 219
220 reportViolation(directive->text(), ContentSecurityPolicy::PluginTypes, messa ge + "\n", KURL()); 220 // 'RedirectStatus::NoRedirect' is safe here, as we do the media type check before actually
221 // loading data; this means that we shouldn't leak redirect targets, as we w on't have had a
222 // chance to redirect yet.
223 reportViolation(directive->text(), ContentSecurityPolicy::PluginTypes, messa ge + "\n", KURL(), ResourceRequest::RedirectStatus::NoRedirect);
221 return denyIfEnforcingPolicy(); 224 return denyIfEnforcingPolicy();
222 } 225 }
223 226
224 bool CSPDirectiveList::checkInlineAndReportViolation(SourceListDirective* direct ive, const String& consoleMessage, const String& contextURL, const WTF::OrdinalN umber& contextLine, bool isScript, const String& hashValue) const 227 bool CSPDirectiveList::checkInlineAndReportViolation(SourceListDirective* direct ive, const String& consoleMessage, const String& contextURL, const WTF::OrdinalN umber& contextLine, bool isScript, const String& hashValue) const
225 { 228 {
226 if (checkInline(directive)) 229 if (checkInline(directive))
227 return true; 230 return true;
228 231
229 String suffix = String(); 232 String suffix = String();
230 if (directive->allowInline() && directive->isHashOrNoncePresent()) { 233 if (directive->allowInline() && directive->isHashOrNoncePresent()) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 prefix = "Refused to load the script '"; 283 prefix = "Refused to load the script '";
281 else if (ContentSecurityPolicy::StyleSrc == effectiveDirective) 284 else if (ContentSecurityPolicy::StyleSrc == effectiveDirective)
282 prefix = "Refused to load the stylesheet '"; 285 prefix = "Refused to load the stylesheet '";
283 286
284 String suffix = String(); 287 String suffix = String();
285 if (checkDynamic(directive)) 288 if (checkDynamic(directive))
286 suffix = " 'unsafe-dynamic' is present, so host-based whitelisting is di sabled."; 289 suffix = " 'unsafe-dynamic' is present, so host-based whitelisting is di sabled.";
287 if (directive == m_defaultSrc) 290 if (directive == m_defaultSrc)
288 suffix = suffix + " Note that '" + effectiveDirective + "' was not expli citly set, so 'default-src' is used as a fallback."; 291 suffix = suffix + " Note that '" + effectiveDirective + "' was not expli citly set, so 'default-src' is used as a fallback.";
289 292
290 reportViolation(directive->text(), effectiveDirective, prefix + url.elidedSt ring() + "' because it violates the following Content Security Policy directive: \"" + directive->text() + "\"." + suffix + "\n", url); 293 reportViolation(directive->text(), effectiveDirective, prefix + url.elidedSt ring() + "' because it violates the following Content Security Policy directive: \"" + directive->text() + "\"." + suffix + "\n", url, redirectStatus);
291 return denyIfEnforcingPolicy(); 294 return denyIfEnforcingPolicy();
292 } 295 }
293 296
294 bool CSPDirectiveList::checkAncestorsAndReportViolation(SourceListDirective* dir ective, LocalFrame* frame, const KURL& url) const 297 bool CSPDirectiveList::checkAncestorsAndReportViolation(SourceListDirective* dir ective, LocalFrame* frame, const KURL& url) const
295 { 298 {
296 if (checkAncestors(directive, frame)) 299 if (checkAncestors(directive, frame))
297 return true; 300 return true;
298 301
299 reportViolationWithFrame(directive->text(), "frame-ancestors", "Refused to d isplay '" + url.elidedString() + "' in a frame because an ancestor violates the following Content Security Policy directive: \"" + directive->text() + "\".", ur l, frame); 302 reportViolationWithFrame(directive->text(), "frame-ancestors", "Refused to d isplay '" + url.elidedString() + "' in a frame because an ancestor violates the following Content Security Policy directive: \"" + directive->text() + "\".", ur l, frame);
300 return denyIfEnforcingPolicy(); 303 return denyIfEnforcingPolicy();
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 visitor->trace(m_imgSrc); 853 visitor->trace(m_imgSrc);
851 visitor->trace(m_mediaSrc); 854 visitor->trace(m_mediaSrc);
852 visitor->trace(m_manifestSrc); 855 visitor->trace(m_manifestSrc);
853 visitor->trace(m_objectSrc); 856 visitor->trace(m_objectSrc);
854 visitor->trace(m_scriptSrc); 857 visitor->trace(m_scriptSrc);
855 visitor->trace(m_styleSrc); 858 visitor->trace(m_styleSrc);
856 } 859 }
857 860
858 861
859 } // namespace blink 862 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698