| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 | 48 |
| 49 namespace { | 49 namespace { |
| 50 | 50 |
| 51 // When a frame is local, use its full URL to represent the main | 51 // When a frame is local, use its full URL to represent the main |
| 52 // resource. When the frame is remote, the full URL isn't accessible, so | 52 // resource. When the frame is remote, the full URL isn't accessible, so |
| 53 // use the origin. This function is used, for example, to determine the | 53 // use the origin. This function is used, for example, to determine the |
| 54 // URL to show in console messages about mixed content. | 54 // URL to show in console messages about mixed content. |
| 55 KURL mainResourceUrlForFrame(Frame* frame) | 55 KURL mainResourceUrlForFrame(Frame* frame) |
| 56 { | 56 { |
| 57 if (frame->isRemoteFrame()) | 57 if (frame->isRemoteFrame()) |
| 58 return KURL(KURL(), frame->securityContext()->securityOrigin()->toString
()); | 58 return KURL(KURL(), frame->securityContext()->getSecurityOrigin()->toStr
ing()); |
| 59 return toLocalFrame(frame)->document()->url(); | 59 return toLocalFrame(frame)->document()->url(); |
| 60 } | 60 } |
| 61 | 61 |
| 62 } // namespace | 62 } // namespace |
| 63 | 63 |
| 64 static void measureStricterVersionOfIsMixedContent(Frame* frame, const KURL& url
) | 64 static void measureStricterVersionOfIsMixedContent(Frame* frame, const KURL& url
) |
| 65 { | 65 { |
| 66 // We're currently only checking for mixed content in `https://*` contexts. | 66 // We're currently only checking for mixed content in `https://*` contexts. |
| 67 // What about other "secure" contexts the SchemeRegistry knows about? We'll | 67 // What about other "secure" contexts the SchemeRegistry knows about? We'll |
| 68 // use this method to measure the occurance of non-webby mixed content to | 68 // use this method to measure the occurance of non-webby mixed content to |
| 69 // make sure we're not breaking the world without realizing it. | 69 // make sure we're not breaking the world without realizing it. |
| 70 SecurityOrigin* origin = frame->securityContext()->securityOrigin(); | 70 SecurityOrigin* origin = frame->securityContext()->getSecurityOrigin(); |
| 71 if (MixedContentChecker::isMixedContent(origin, url)) { | 71 if (MixedContentChecker::isMixedContent(origin, url)) { |
| 72 if (origin->protocol() != "https") | 72 if (origin->protocol() != "https") |
| 73 UseCounter::count(frame, UseCounter::MixedContentInNonHTTPSFrameThat
RestrictsMixedContent); | 73 UseCounter::count(frame, UseCounter::MixedContentInNonHTTPSFrameThat
RestrictsMixedContent); |
| 74 } else if (!SecurityOrigin::isSecure(url) && SchemeRegistry::shouldTreatURLS
chemeAsSecure(origin->protocol())) { | 74 } else if (!SecurityOrigin::isSecure(url) && SchemeRegistry::shouldTreatURLS
chemeAsSecure(origin->protocol())) { |
| 75 UseCounter::count(frame, UseCounter::MixedContentInSecureFrameThatDoesNo
tRestrictMixedContent); | 75 UseCounter::count(frame, UseCounter::MixedContentInSecureFrameThatDoesNo
tRestrictMixedContent); |
| 76 } | 76 } |
| 77 } | 77 } |
| 78 | 78 |
| 79 bool requestIsSubframeSubresource(Frame* frame, WebURLRequest::FrameType frameTy
pe) | 79 bool requestIsSubframeSubresource(Frame* frame, WebURLRequest::FrameType frameTy
pe) |
| 80 { | 80 { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 94 // static | 94 // static |
| 95 Frame* MixedContentChecker::inWhichFrameIsContentMixed(Frame* frame, WebURLReque
st::FrameType frameType, const KURL& url) | 95 Frame* MixedContentChecker::inWhichFrameIsContentMixed(Frame* frame, WebURLReque
st::FrameType frameType, const KURL& url) |
| 96 { | 96 { |
| 97 // We only care about subresource loads; top-level navigations cannot be mix
ed content. Neither can frameless requests. | 97 // We only care about subresource loads; top-level navigations cannot be mix
ed content. Neither can frameless requests. |
| 98 if (frameType == WebURLRequest::FrameTypeTopLevel || !frame) | 98 if (frameType == WebURLRequest::FrameTypeTopLevel || !frame) |
| 99 return nullptr; | 99 return nullptr; |
| 100 | 100 |
| 101 // Check the top frame first. | 101 // Check the top frame first. |
| 102 if (Frame* top = frame->tree().top()) { | 102 if (Frame* top = frame->tree().top()) { |
| 103 measureStricterVersionOfIsMixedContent(top, url); | 103 measureStricterVersionOfIsMixedContent(top, url); |
| 104 if (isMixedContent(top->securityContext()->securityOrigin(), url)) | 104 if (isMixedContent(top->securityContext()->getSecurityOrigin(), url)) |
| 105 return top; | 105 return top; |
| 106 } | 106 } |
| 107 | 107 |
| 108 measureStricterVersionOfIsMixedContent(frame, url); | 108 measureStricterVersionOfIsMixedContent(frame, url); |
| 109 if (isMixedContent(frame->securityContext()->securityOrigin(), url)) | 109 if (isMixedContent(frame->securityContext()->getSecurityOrigin(), url)) |
| 110 return frame; | 110 return frame; |
| 111 | 111 |
| 112 // No mixed content, no problem. | 112 // No mixed content, no problem. |
| 113 return nullptr; | 113 return nullptr; |
| 114 } | 114 } |
| 115 | 115 |
| 116 // static | 116 // static |
| 117 MixedContentChecker::ContextType MixedContentChecker::contextTypeFromContext(Web
URLRequest::RequestContext context, Frame* frame) | 117 MixedContentChecker::ContextType MixedContentChecker::contextTypeFromContext(Web
URLRequest::RequestContext context, Frame* frame) |
| 118 { | 118 { |
| 119 switch (context) { | 119 switch (context) { |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 if (!mixedFrame) | 314 if (!mixedFrame) |
| 315 return false; | 315 return false; |
| 316 | 316 |
| 317 MixedContentChecker::count(mixedFrame, requestContext); | 317 MixedContentChecker::count(mixedFrame, requestContext); |
| 318 | 318 |
| 319 Settings* settings = mixedFrame->settings(); | 319 Settings* settings = mixedFrame->settings(); |
| 320 // Use the current local frame's client; the embedder doesn't | 320 // Use the current local frame's client; the embedder doesn't |
| 321 // distinguish mixed content signals from different frames on the | 321 // distinguish mixed content signals from different frames on the |
| 322 // same page. | 322 // same page. |
| 323 FrameLoaderClient* client = frame->loader().client(); | 323 FrameLoaderClient* client = frame->loader().client(); |
| 324 SecurityOrigin* securityOrigin = mixedFrame->securityContext()->securityOrig
in(); | 324 SecurityOrigin* securityOrigin = mixedFrame->securityContext()->getSecurityO
rigin(); |
| 325 bool allowed = false; | 325 bool allowed = false; |
| 326 | 326 |
| 327 // If we're in strict mode, we'll automagically fail everything, and intenti
onally skip | 327 // If we're in strict mode, we'll automagically fail everything, and intenti
onally skip |
| 328 // the client checks in order to prevent degrading the site's security UI. | 328 // the client checks in order to prevent degrading the site's security UI. |
| 329 bool strictMode = mixedFrame->securityContext()->shouldEnforceStrictMixedCon
tentChecking() || settings->strictMixedContentChecking(); | 329 bool strictMode = mixedFrame->securityContext()->shouldEnforceStrictMixedCon
tentChecking() || settings->strictMixedContentChecking(); |
| 330 | 330 |
| 331 ContextType contextType = contextTypeFromContext(requestContext, mixedFrame)
; | 331 ContextType contextType = contextTypeFromContext(requestContext, mixedFrame)
; |
| 332 | 332 |
| 333 // If we're loading the main resource of a subframe, we need to take a close
look at the loaded URL. | 333 // If we're loading the main resource of a subframe, we need to take a close
look at the loaded URL. |
| 334 // If we're dealing with a CORS-enabled scheme, then block mixed frames as a
ctive content. Otherwise, | 334 // If we're dealing with a CORS-enabled scheme, then block mixed frames as a
ctive content. Otherwise, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 348 | 348 |
| 349 case ContextTypeBlockable: { | 349 case ContextTypeBlockable: { |
| 350 // Strictly block subresources that are mixed with respect to | 350 // Strictly block subresources that are mixed with respect to |
| 351 // their subframes, unless all insecure content is allowed. This | 351 // their subframes, unless all insecure content is allowed. This |
| 352 // is to avoid the following situation: https://a.com embeds | 352 // is to avoid the following situation: https://a.com embeds |
| 353 // https://b.com, which loads a script over insecure HTTP. The | 353 // https://b.com, which loads a script over insecure HTTP. The |
| 354 // user opts to allow the insecure content, thinking that they are | 354 // user opts to allow the insecure content, thinking that they are |
| 355 // allowing an insecure script to run on https://a.com and not | 355 // allowing an insecure script to run on https://a.com and not |
| 356 // realizing that they are in fact allowing an insecure script on | 356 // realizing that they are in fact allowing an insecure script on |
| 357 // https://b.com. | 357 // https://b.com. |
| 358 if (!settings->allowRunningOfInsecureContent() && requestIsSubframeSubre
source(effectiveFrame, frameType) && isMixedContent(frame->securityContext()->se
curityOrigin(), url)) { | 358 if (!settings->allowRunningOfInsecureContent() && requestIsSubframeSubre
source(effectiveFrame, frameType) && isMixedContent(frame->securityContext()->ge
tSecurityOrigin(), url)) { |
| 359 UseCounter::count(mixedFrame, UseCounter::BlockableMixedContentInSub
frameBlocked); | 359 UseCounter::count(mixedFrame, UseCounter::BlockableMixedContentInSub
frameBlocked); |
| 360 allowed = false; | 360 allowed = false; |
| 361 break; | 361 break; |
| 362 } | 362 } |
| 363 | 363 |
| 364 bool shouldAskEmbedder = !strictMode && settings && (!settings->strictly
BlockBlockableMixedContent() || settings->allowRunningOfInsecureContent()); | 364 bool shouldAskEmbedder = !strictMode && settings && (!settings->strictly
BlockBlockableMixedContent() || settings->allowRunningOfInsecureContent()); |
| 365 allowed = shouldAskEmbedder && client->allowRunningInsecureContent(setti
ngs && settings->allowRunningOfInsecureContent(), securityOrigin, url); | 365 allowed = shouldAskEmbedder && client->allowRunningInsecureContent(setti
ngs && settings->allowRunningOfInsecureContent(), securityOrigin, url); |
| 366 if (allowed) { | 366 if (allowed) { |
| 367 client->didRunInsecureContent(securityOrigin, url); | 367 client->didRunInsecureContent(securityOrigin, url); |
| 368 UseCounter::count(mixedFrame, UseCounter::MixedContentBlockableAllow
ed); | 368 UseCounter::count(mixedFrame, UseCounter::MixedContentBlockableAllow
ed); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 return false; | 404 return false; |
| 405 | 405 |
| 406 UseCounter::count(mixedFrame, UseCounter::MixedContentPresent); | 406 UseCounter::count(mixedFrame, UseCounter::MixedContentPresent); |
| 407 UseCounter::count(mixedFrame, UseCounter::MixedContentWebSocket); | 407 UseCounter::count(mixedFrame, UseCounter::MixedContentWebSocket); |
| 408 | 408 |
| 409 Settings* settings = mixedFrame->settings(); | 409 Settings* settings = mixedFrame->settings(); |
| 410 // Use the current local frame's client; the embedder doesn't | 410 // Use the current local frame's client; the embedder doesn't |
| 411 // distinguish mixed content signals from different frames on the | 411 // distinguish mixed content signals from different frames on the |
| 412 // same page. | 412 // same page. |
| 413 FrameLoaderClient* client = frame->loader().client(); | 413 FrameLoaderClient* client = frame->loader().client(); |
| 414 SecurityOrigin* securityOrigin = mixedFrame->securityContext()->securityOrig
in(); | 414 SecurityOrigin* securityOrigin = mixedFrame->securityContext()->getSecurityO
rigin(); |
| 415 bool allowed = false; | 415 bool allowed = false; |
| 416 | 416 |
| 417 // If we're in strict mode, we'll automagically fail everything, and intenti
onally skip | 417 // If we're in strict mode, we'll automagically fail everything, and intenti
onally skip |
| 418 // the client checks in order to prevent degrading the site's security UI. | 418 // the client checks in order to prevent degrading the site's security UI. |
| 419 bool strictMode = mixedFrame->securityContext()->shouldEnforceStrictMixedCon
tentChecking() || settings->strictMixedContentChecking(); | 419 bool strictMode = mixedFrame->securityContext()->shouldEnforceStrictMixedCon
tentChecking() || settings->strictMixedContentChecking(); |
| 420 if (!strictMode) { | 420 if (!strictMode) { |
| 421 bool allowedPerSettings = settings && settings->allowRunningOfInsecureCo
ntent(); | 421 bool allowedPerSettings = settings && settings->allowRunningOfInsecureCo
ntent(); |
| 422 allowed = client->allowRunningInsecureContent(allowedPerSettings, securi
tyOrigin, url); | 422 allowed = client->allowRunningInsecureContent(allowedPerSettings, securi
tyOrigin, url); |
| 423 } | 423 } |
| 424 | 424 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 | 519 |
| 520 // See comment in shouldBlockFetch() about loading the main resource of a su
bframe. | 520 // See comment in shouldBlockFetch() about loading the main resource of a su
bframe. |
| 521 if (request.frameType() == WebURLRequest::FrameTypeNested && !SchemeRegistry
::shouldTreatURLSchemeAsCORSEnabled(request.url().protocol())) { | 521 if (request.frameType() == WebURLRequest::FrameTypeNested && !SchemeRegistry
::shouldTreatURLSchemeAsCORSEnabled(request.url().protocol())) { |
| 522 return ContextTypeOptionallyBlockable; | 522 return ContextTypeOptionallyBlockable; |
| 523 } | 523 } |
| 524 | 524 |
| 525 return contextTypeFromContext(request.requestContext(), mixedFrame); | 525 return contextTypeFromContext(request.requestContext(), mixedFrame); |
| 526 } | 526 } |
| 527 | 527 |
| 528 } // namespace blink | 528 } // namespace blink |
| OLD | NEW |