OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 20 matching lines...) Expand all Loading... |
31 | 31 |
32 #include "core/dom/Document.h" | 32 #include "core/dom/Document.h" |
33 #include "core/frame/LocalFrame.h" | 33 #include "core/frame/LocalFrame.h" |
34 #include "core/frame/Settings.h" | 34 #include "core/frame/Settings.h" |
35 #include "core/frame/UseCounter.h" | 35 #include "core/frame/UseCounter.h" |
36 #include "core/inspector/ConsoleMessage.h" | 36 #include "core/inspector/ConsoleMessage.h" |
37 #include "core/loader/DocumentLoader.h" | 37 #include "core/loader/DocumentLoader.h" |
38 #include "core/loader/FrameLoader.h" | 38 #include "core/loader/FrameLoader.h" |
39 #include "core/loader/FrameLoaderClient.h" | 39 #include "core/loader/FrameLoaderClient.h" |
40 #include "platform/RuntimeEnabledFeatures.h" | 40 #include "platform/RuntimeEnabledFeatures.h" |
| 41 #include "platform/network/ResourceRequest.h" |
41 #include "platform/weborigin/SchemeRegistry.h" | 42 #include "platform/weborigin/SchemeRegistry.h" |
42 #include "platform/weborigin/SecurityOrigin.h" | 43 #include "platform/weborigin/SecurityOrigin.h" |
43 #include "public/platform/Platform.h" | 44 #include "public/platform/Platform.h" |
44 #include "wtf/text/StringBuilder.h" | 45 #include "wtf/text/StringBuilder.h" |
45 | 46 |
46 namespace blink { | 47 namespace blink { |
47 | 48 |
48 static void measureStricterVersionOfIsMixedContent(LocalFrame* frame, const KURL
& url) | 49 static void measureStricterVersionOfIsMixedContent(LocalFrame* frame, const KURL
& url) |
49 { | 50 { |
50 // We're currently only checking for mixed content in `https://*` contexts. | 51 // We're currently only checking for mixed content in `https://*` contexts. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 | 93 |
93 measureStricterVersionOfIsMixedContent(frame, url); | 94 measureStricterVersionOfIsMixedContent(frame, url); |
94 if (isMixedContent(frame->document()->securityOrigin(), url)) | 95 if (isMixedContent(frame->document()->securityOrigin(), url)) |
95 return frame; | 96 return frame; |
96 | 97 |
97 // No mixed content, no problem. | 98 // No mixed content, no problem. |
98 return nullptr; | 99 return nullptr; |
99 } | 100 } |
100 | 101 |
101 // static | 102 // static |
102 MixedContentChecker::ContextType MixedContentChecker::contextTypeFromContext(Web
URLRequest::RequestContext context, LocalFrame* frame) | 103 ResourceRequest::ContextType MixedContentChecker::contextTypeFromContext(WebURLR
equest::RequestContext context, LocalFrame* frame) |
103 { | 104 { |
104 switch (context) { | 105 switch (context) { |
105 // "Optionally-blockable" mixed content | 106 // "Optionally-blockable" mixed content |
106 case WebURLRequest::RequestContextAudio: | 107 case WebURLRequest::RequestContextAudio: |
107 case WebURLRequest::RequestContextFavicon: | 108 case WebURLRequest::RequestContextFavicon: |
108 case WebURLRequest::RequestContextImage: | 109 case WebURLRequest::RequestContextImage: |
109 case WebURLRequest::RequestContextVideo: | 110 case WebURLRequest::RequestContextVideo: |
110 return ContextTypeOptionallyBlockable; | 111 return ResourceRequest::ContextTypeOptionallyBlockable; |
111 | 112 |
112 // Plugins! Oh how dearly we love plugin-loaded content! | 113 // Plugins! Oh how dearly we love plugin-loaded content! |
113 case WebURLRequest::RequestContextPlugin: { | 114 case WebURLRequest::RequestContextPlugin: { |
114 Settings* settings = frame->settings(); | 115 Settings* settings = frame->settings(); |
115 return settings || settings->strictMixedContentCheckingForPlugin() ? Con
textTypeBlockable : ContextTypeOptionallyBlockable; | 116 return settings || settings->strictMixedContentCheckingForPlugin() ? Res
ourceRequest::ContextTypeBlockable : ResourceRequest::ContextTypeOptionallyBlock
able; |
116 } | 117 } |
117 | 118 |
118 // "Blockable" mixed content | 119 // "Blockable" mixed content |
119 case WebURLRequest::RequestContextBeacon: | 120 case WebURLRequest::RequestContextBeacon: |
120 case WebURLRequest::RequestContextCSPReport: | 121 case WebURLRequest::RequestContextCSPReport: |
121 case WebURLRequest::RequestContextEmbed: | 122 case WebURLRequest::RequestContextEmbed: |
122 case WebURLRequest::RequestContextEventSource: | 123 case WebURLRequest::RequestContextEventSource: |
123 case WebURLRequest::RequestContextFetch: | 124 case WebURLRequest::RequestContextFetch: |
124 case WebURLRequest::RequestContextFont: | 125 case WebURLRequest::RequestContextFont: |
125 case WebURLRequest::RequestContextForm: | 126 case WebURLRequest::RequestContextForm: |
126 case WebURLRequest::RequestContextFrame: | 127 case WebURLRequest::RequestContextFrame: |
127 case WebURLRequest::RequestContextHyperlink: | 128 case WebURLRequest::RequestContextHyperlink: |
128 case WebURLRequest::RequestContextIframe: | 129 case WebURLRequest::RequestContextIframe: |
129 case WebURLRequest::RequestContextImageSet: | 130 case WebURLRequest::RequestContextImageSet: |
130 case WebURLRequest::RequestContextImport: | 131 case WebURLRequest::RequestContextImport: |
131 case WebURLRequest::RequestContextLocation: | 132 case WebURLRequest::RequestContextLocation: |
132 case WebURLRequest::RequestContextManifest: | 133 case WebURLRequest::RequestContextManifest: |
133 case WebURLRequest::RequestContextObject: | 134 case WebURLRequest::RequestContextObject: |
134 case WebURLRequest::RequestContextPing: | 135 case WebURLRequest::RequestContextPing: |
135 case WebURLRequest::RequestContextScript: | 136 case WebURLRequest::RequestContextScript: |
136 case WebURLRequest::RequestContextServiceWorker: | 137 case WebURLRequest::RequestContextServiceWorker: |
137 case WebURLRequest::RequestContextSharedWorker: | 138 case WebURLRequest::RequestContextSharedWorker: |
138 case WebURLRequest::RequestContextStyle: | 139 case WebURLRequest::RequestContextStyle: |
139 case WebURLRequest::RequestContextSubresource: | 140 case WebURLRequest::RequestContextSubresource: |
140 case WebURLRequest::RequestContextTrack: | 141 case WebURLRequest::RequestContextTrack: |
141 case WebURLRequest::RequestContextWorker: | 142 case WebURLRequest::RequestContextWorker: |
142 case WebURLRequest::RequestContextXMLHttpRequest: | 143 case WebURLRequest::RequestContextXMLHttpRequest: |
143 case WebURLRequest::RequestContextXSLT: | 144 case WebURLRequest::RequestContextXSLT: |
144 return ContextTypeBlockable; | 145 return ResourceRequest::ContextTypeBlockable; |
145 | 146 |
146 // FIXME: Contexts that we should block, but don't currently. https://crbug.
com/388650 | 147 // FIXME: Contexts that we should block, but don't currently. https://crbug.
com/388650 |
147 case WebURLRequest::RequestContextDownload: | 148 case WebURLRequest::RequestContextDownload: |
148 case WebURLRequest::RequestContextInternal: | 149 case WebURLRequest::RequestContextInternal: |
149 case WebURLRequest::RequestContextPrefetch: | 150 case WebURLRequest::RequestContextPrefetch: |
150 return ContextTypeShouldBeBlockable; | 151 return ResourceRequest::ContextTypeShouldBeBlockable; |
151 | 152 |
152 case WebURLRequest::RequestContextUnspecified: | 153 case WebURLRequest::RequestContextUnspecified: |
153 ASSERT_NOT_REACHED(); | 154 ASSERT_NOT_REACHED(); |
154 } | 155 } |
155 ASSERT_NOT_REACHED(); | 156 ASSERT_NOT_REACHED(); |
156 return ContextTypeBlockable; | 157 return ResourceRequest::ContextTypeBlockable; |
157 } | 158 } |
158 | 159 |
159 // static | 160 // static |
160 const char* MixedContentChecker::typeNameFromContext(WebURLRequest::RequestConte
xt context) | 161 const char* MixedContentChecker::typeNameFromContext(WebURLRequest::RequestConte
xt context) |
161 { | 162 { |
162 switch (context) { | 163 switch (context) { |
163 case WebURLRequest::RequestContextAudio: | 164 case WebURLRequest::RequestContextAudio: |
164 return "audio file"; | 165 return "audio file"; |
165 case WebURLRequest::RequestContextBeacon: | 166 case WebURLRequest::RequestContextBeacon: |
166 return "Beacon endpoint"; | 167 return "Beacon endpoint"; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageS
ource, messageLevel, message)); | 245 frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageS
ource, messageLevel, message)); |
245 } | 246 } |
246 | 247 |
247 // static | 248 // static |
248 void MixedContentChecker::count(LocalFrame* frame, WebURLRequest::RequestContext
requestContext) | 249 void MixedContentChecker::count(LocalFrame* frame, WebURLRequest::RequestContext
requestContext) |
249 { | 250 { |
250 UseCounter::count(frame, UseCounter::MixedContentPresent); | 251 UseCounter::count(frame, UseCounter::MixedContentPresent); |
251 | 252 |
252 // Roll blockable content up into a single counter, count unblocked types in
dividually so we | 253 // Roll blockable content up into a single counter, count unblocked types in
dividually so we |
253 // can determine when they can be safely moved to the blockable category: | 254 // can determine when they can be safely moved to the blockable category: |
254 ContextType contextType = contextTypeFromContext(requestContext, frame); | 255 ResourceRequest::ContextType contextType = contextTypeFromContext(requestCon
text, frame); |
255 if (contextType == ContextTypeBlockable) { | 256 if (contextType == ResourceRequest::ContextTypeBlockable) { |
256 UseCounter::count(frame, UseCounter::MixedContentBlockable); | 257 UseCounter::count(frame, UseCounter::MixedContentBlockable); |
257 return; | 258 return; |
258 } | 259 } |
259 | 260 |
260 UseCounter::Feature feature; | 261 UseCounter::Feature feature; |
261 switch (requestContext) { | 262 switch (requestContext) { |
262 case WebURLRequest::RequestContextAudio: | 263 case WebURLRequest::RequestContextAudio: |
263 feature = UseCounter::MixedContentAudio; | 264 feature = UseCounter::MixedContentAudio; |
264 break; | 265 break; |
265 case WebURLRequest::RequestContextDownload: | 266 case WebURLRequest::RequestContextDownload: |
(...skipping 19 matching lines...) Expand all Loading... |
285 break; | 286 break; |
286 | 287 |
287 default: | 288 default: |
288 ASSERT_NOT_REACHED(); | 289 ASSERT_NOT_REACHED(); |
289 return; | 290 return; |
290 } | 291 } |
291 UseCounter::count(frame, feature); | 292 UseCounter::count(frame, feature); |
292 } | 293 } |
293 | 294 |
294 // static | 295 // static |
295 bool MixedContentChecker::shouldBlockFetch(LocalFrame* frame, WebURLRequest::Req
uestContext requestContext, WebURLRequest::FrameType frameType, const KURL& url,
MixedContentChecker::ReportingStatus reportingStatus) | 296 bool MixedContentChecker::shouldBlockFetch(LocalFrame* frame, ResourceRequest* r
equest, WebURLRequest::RequestContext requestContext, WebURLRequest::FrameType f
rameType, const KURL& url, MixedContentChecker::ReportingStatus reportingStatus) |
296 { | 297 { |
297 LocalFrame* mixedFrame = inWhichFrameIsContentMixed(frame, frameType, url); | 298 LocalFrame* mixedFrame = inWhichFrameIsContentMixed(frame, frameType, url); |
298 if (!mixedFrame) | 299 if (!mixedFrame) |
299 return false; | 300 return false; |
300 | 301 |
301 MixedContentChecker::count(mixedFrame, requestContext); | 302 MixedContentChecker::count(mixedFrame, requestContext); |
302 | 303 |
303 Settings* settings = mixedFrame->settings(); | 304 Settings* settings = mixedFrame->settings(); |
304 FrameLoaderClient* client = mixedFrame->loader().client(); | 305 FrameLoaderClient* client = mixedFrame->loader().client(); |
305 SecurityOrigin* securityOrigin = mixedFrame->document()->securityOrigin(); | 306 SecurityOrigin* securityOrigin = mixedFrame->document()->securityOrigin(); |
306 bool allowed = false; | 307 bool allowed = false; |
307 | 308 |
308 // If we're in strict mode, we'll automagically fail everything, and intenti
onally skip | 309 // If we're in strict mode, we'll automagically fail everything, and intenti
onally skip |
309 // the client checks in order to prevent degrading the site's security UI. | 310 // the client checks in order to prevent degrading the site's security UI. |
310 bool strictMode = mixedFrame->document()->shouldEnforceStrictMixedContentChe
cking() || settings->strictMixedContentChecking(); | 311 bool strictMode = mixedFrame->document()->shouldEnforceStrictMixedContentChe
cking() || settings->strictMixedContentChecking(); |
311 | 312 |
312 ContextType contextType = contextTypeFromContext(requestContext, mixedFrame)
; | 313 ResourceRequest::ContextType contextType = contextTypeFromContext(requestCon
text, mixedFrame); |
313 | 314 |
314 // If we're loading the main resource of a subframe, we need to take a close
look at the loaded URL. | 315 // If we're loading the main resource of a subframe, we need to take a close
look at the loaded URL. |
315 // If we're dealing with a CORS-enabled scheme, then block mixed frames as a
ctive content. Otherwise, | 316 // If we're dealing with a CORS-enabled scheme, then block mixed frames as a
ctive content. Otherwise, |
316 // treat frames as passive content. | 317 // treat frames as passive content. |
317 // | 318 // |
318 // FIXME: Remove this temporary hack once we have a reasonable API for launc
hing external applications | 319 // FIXME: Remove this temporary hack once we have a reasonable API for launc
hing external applications |
319 // via URLs. http://crbug.com/318788 and https://crbug.com/393481 | 320 // via URLs. http://crbug.com/318788 and https://crbug.com/393481 |
320 if (frameType == WebURLRequest::FrameTypeNested && !SchemeRegistry::shouldTr
eatURLSchemeAsCORSEnabled(url.protocol())) | 321 if (frameType == WebURLRequest::FrameTypeNested && !SchemeRegistry::shouldTr
eatURLSchemeAsCORSEnabled(url.protocol())) |
321 contextType = ContextTypeOptionallyBlockable; | 322 contextType = ResourceRequest::ContextTypeOptionallyBlockable; |
322 | 323 |
323 switch (contextType) { | 324 switch (contextType) { |
324 case ContextTypeOptionallyBlockable: | 325 case ResourceRequest::ContextTypeOptionallyBlockable: |
325 allowed = !strictMode && client->allowDisplayingInsecureContent(settings
&& settings->allowDisplayOfInsecureContent(), securityOrigin, url); | 326 allowed = !strictMode && client->allowDisplayingInsecureContent(settings
&& settings->allowDisplayOfInsecureContent(), securityOrigin, url); |
326 if (allowed) | 327 if (allowed) |
327 client->didDisplayInsecureContent(); | 328 client->didDisplayInsecureContent(); |
328 break; | 329 break; |
329 | 330 |
330 case ContextTypeBlockable: { | 331 case ResourceRequest::ContextTypeBlockable: { |
331 bool shouldAskEmbedder = !strictMode && settings && (!settings->strictly
BlockBlockableMixedContent() || settings->allowRunningOfInsecureContent()); | 332 bool shouldAskEmbedder = !strictMode && settings && (!settings->strictly
BlockBlockableMixedContent() || settings->allowRunningOfInsecureContent()); |
332 allowed = shouldAskEmbedder && client->allowRunningInsecureContent(setti
ngs && settings->allowRunningOfInsecureContent(), securityOrigin, url); | 333 allowed = shouldAskEmbedder && client->allowRunningInsecureContent(setti
ngs && settings->allowRunningOfInsecureContent(), securityOrigin, url); |
333 if (allowed) { | 334 if (allowed) { |
334 client->didRunInsecureContent(securityOrigin, url); | 335 client->didRunInsecureContent(securityOrigin, url); |
335 UseCounter::count(mixedFrame, UseCounter::MixedContentBlockableAllow
ed); | 336 UseCounter::count(mixedFrame, UseCounter::MixedContentBlockableAllow
ed); |
336 } | 337 } |
337 break; | 338 break; |
338 } | 339 } |
339 | 340 |
340 case ContextTypeShouldBeBlockable: | 341 case ResourceRequest::ContextTypeShouldBeBlockable: |
341 allowed = !strictMode; | 342 allowed = !strictMode; |
342 if (allowed) | 343 if (allowed) |
343 client->didDisplayInsecureContent(); | 344 client->didDisplayInsecureContent(); |
344 break; | 345 break; |
345 }; | 346 }; |
346 | 347 |
| 348 if (request) { |
| 349 request->setContextType(contextType); |
| 350 request->setIsMixedContent(true); |
| 351 } |
| 352 |
347 if (reportingStatus == SendReport) | 353 if (reportingStatus == SendReport) |
348 logToConsoleAboutFetch(frame, url, requestContext, allowed); | 354 logToConsoleAboutFetch(frame, url, requestContext, allowed); |
349 return !allowed; | 355 return !allowed; |
350 } | 356 } |
351 | 357 |
352 // static | 358 // static |
353 void MixedContentChecker::logToConsoleAboutWebSocket(LocalFrame* frame, const KU
RL& url, bool allowed) | 359 void MixedContentChecker::logToConsoleAboutWebSocket(LocalFrame* frame, const KU
RL& url, bool allowed) |
354 { | 360 { |
355 String message = String::format( | 361 String message = String::format( |
356 "Mixed Content: The page at '%s' was loaded over HTTPS, but attempted to
connect to the insecure WebSocket endpoint '%s'. %s", | 362 "Mixed Content: The page at '%s' was loaded over HTTPS, but attempted to
connect to the insecure WebSocket endpoint '%s'. %s", |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 { | 427 { |
422 if (!frame || !frame->document() || !frame->document()->loader()) | 428 if (!frame || !frame->document() || !frame->document()->loader()) |
423 return; | 429 return; |
424 | 430 |
425 // Just count these for the moment, don't block them. | 431 // Just count these for the moment, don't block them. |
426 if (Platform::current()->isReservedIPAddress(resourceIPAddress) && !frame->d
ocument()->isHostedInReservedIPRange()) | 432 if (Platform::current()->isReservedIPAddress(resourceIPAddress) && !frame->d
ocument()->isHostedInReservedIPRange()) |
427 UseCounter::count(frame->document(), UseCounter::MixedContentPrivateHost
nameInPublicHostname); | 433 UseCounter::count(frame->document(), UseCounter::MixedContentPrivateHost
nameInPublicHostname); |
428 } | 434 } |
429 | 435 |
430 } // namespace blink | 436 } // namespace blink |
OLD | NEW |