| 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 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 void MixedContentChecker::logToConsole(LocalFrame* frame, const KURL& url, WebUR
LRequest::RequestContext requestContext, bool allowed) | 205 void MixedContentChecker::logToConsole(LocalFrame* frame, const KURL& url, WebUR
LRequest::RequestContext requestContext, bool allowed) |
| 206 { | 206 { |
| 207 String message = String::format( | 207 String message = String::format( |
| 208 "Mixed Content: The page at '%s' was loaded over HTTPS, but requested an
insecure %s '%s'. %s", | 208 "Mixed Content: The page at '%s' was loaded over HTTPS, but requested an
insecure %s '%s'. %s", |
| 209 frame->document()->url().elidedString().utf8().data(), typeNameFromConte
xt(requestContext), url.elidedString().utf8().data(), | 209 frame->document()->url().elidedString().utf8().data(), typeNameFromConte
xt(requestContext), url.elidedString().utf8().data(), |
| 210 allowed ? "This content should also be served over HTTPS." : "This reque
st has been blocked; the content must be served over HTTPS."); | 210 allowed ? "This content should also be served over HTTPS." : "This reque
st has been blocked; the content must be served over HTTPS."); |
| 211 MessageLevel messageLevel = allowed ? WarningMessageLevel : ErrorMessageLeve
l; | 211 MessageLevel messageLevel = allowed ? WarningMessageLevel : ErrorMessageLeve
l; |
| 212 frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageS
ource, messageLevel, message)); | 212 frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageS
ource, messageLevel, message)); |
| 213 } | 213 } |
| 214 | 214 |
| 215 // static | 215 LocalFrame* MixedContentChecker::inWhichFrameIsThisContentMixed(LocalFrame* fram
e, WebURLRequest::RequestContext requestContext, WebURLRequest::FrameType frameT
ype, const KURL& url) |
| 216 bool MixedContentChecker::shouldBlockFetch(LocalFrame* frame, const ResourceRequ
est& resourceRequest, const KURL& url) | |
| 217 { | 216 { |
| 218 // No frame, no mixed content: | 217 // No frame, no mixed content: |
| 219 if (!frame) | 218 if (!frame) |
| 220 return false; | 219 return nullptr; |
| 220 |
| 221 // We only care about subresource loads; top-level navigations cannot be mix
ed content. |
| 222 if (frameType == WebURLRequest::FrameTypeTopLevel) |
| 223 return nullptr; |
| 221 | 224 |
| 222 // Check the top frame first. | 225 // Check the top frame first. |
| 223 if (Frame* top = frame->tree().top()) { | 226 if (Frame* top = frame->tree().top()) { |
| 224 // FIXME: We need a way to access the top-level frame's SecurityOrigin w
hen that frame | 227 // FIXME: We need a way to access the top-level frame's SecurityOrigin w
hen that frame |
| 225 // is in a different process from the current frame. Until that is done,
we bail out | 228 // is in a different process from the current frame. Until that is done,
we bail out |
| 226 // early and allow the load. | 229 // early and allow the load. |
| 227 if (!top->isLocalFrame()) | 230 if (!top->isLocalFrame()) |
| 228 return false; | 231 return nullptr; |
| 229 | 232 |
| 230 LocalFrame* localTop = toLocalFrame(top); | 233 LocalFrame* localTop = toLocalFrame(top); |
| 231 if (frame != localTop && shouldBlockFetch(localTop, resourceRequest, url
)) | 234 if (frame != localTop && inWhichFrameIsThisContentMixed(localTop, reques
tContext, frameType, url)) |
| 232 return true; | 235 return localTop; |
| 233 } | 236 } |
| 234 | 237 |
| 235 // We only care about subresource loads; top-level navigations cannot be mix
ed content. | 238 // Just count these for the moment, don't block them. |
| 236 if (resourceRequest.frameType() == WebURLRequest::FrameTypeTopLevel) | 239 if (Platform::current()->isReservedIPAddress(url) && !Platform::current()->i
sReservedIPAddress(KURL(ParsedURLString, frame->document()->securityOrigin()->to
String()))) |
| 237 return false; | 240 UseCounter::count(frame->document(), contextTypeFromContext(requestConte
xt) == ContextTypeBlockable ? UseCounter::MixedContentPrivateIPInPublicWebsiteAc
tive : UseCounter::MixedContentPrivateIPInPublicWebsitePassive); |
| 238 | 241 |
| 239 // No mixed content, no problem. | 242 // No mixed content, no problem. |
| 240 if (!isMixedContent(frame->document()->securityOrigin(), url)) | 243 if (!isMixedContent(frame->document()->securityOrigin(), url)) |
| 244 return nullptr; |
| 245 |
| 246 return frame; |
| 247 } |
| 248 |
| 249 // static |
| 250 bool MixedContentChecker::shouldBlockFetch(LocalFrame* frame, WebURLRequest::Req
uestContext requestContext, WebURLRequest::FrameType frameType, const KURL& url) |
| 251 { |
| 252 LocalFrame* effectiveFrame = inWhichFrameIsThisContentMixed(frame, requestCo
ntext, frameType, url); |
| 253 if (!effectiveFrame) |
| 241 return false; | 254 return false; |
| 242 | 255 |
| 243 Settings* settings = frame->settings(); | 256 // We grab the settings and client from the frame in which the content was m
ixed, as it might be |
| 244 FrameLoaderClient* client = frame->loader().client(); | 257 // configured to allow mixed content in a different way than the frame in wh
ich the content |
| 245 SecurityOrigin* securityOrigin = frame->document()->securityOrigin(); | 258 // loads (e.g. if Frame A is allowed to frame an insecure Frame B, we defer
to Frame A's settings |
| 259 // when evaluating Frame B's subresource loads). Yes, this is confusing. |
| 260 Settings* settings = effectiveFrame->settings(); |
| 261 FrameLoaderClient* client = effectiveFrame->loader().client(); |
| 262 SecurityOrigin* securityOrigin = effectiveFrame->document()->securityOrigin(
); |
| 246 bool allowed = false; | 263 bool allowed = false; |
| 247 | 264 |
| 248 ContextType contextType = contextTypeFromContext(resourceRequest.requestCont
ext()); | 265 ContextType contextType = contextTypeFromContext(requestContext); |
| 249 if (contextType == ContextTypeBlockableUnlessLax) | 266 if (contextType == ContextTypeBlockableUnlessLax) |
| 250 contextType = RuntimeEnabledFeatures::laxMixedContentCheckingEnabled() ?
ContextTypeOptionallyBlockable : ContextTypeBlockable; | 267 contextType = RuntimeEnabledFeatures::laxMixedContentCheckingEnabled() ?
ContextTypeOptionallyBlockable : ContextTypeBlockable; |
| 251 | 268 |
| 252 switch (contextType) { | 269 switch (contextType) { |
| 253 case ContextTypeOptionallyBlockable: | 270 case ContextTypeOptionallyBlockable: |
| 254 allowed = client->allowDisplayingInsecureContent(settings && settings->a
llowDisplayOfInsecureContent(), securityOrigin, url); | 271 allowed = client->allowDisplayingInsecureContent(settings && settings->a
llowDisplayOfInsecureContent(), securityOrigin, url); |
| 255 if (allowed) | 272 if (allowed) |
| 256 client->didDisplayInsecureContent(); | 273 client->didDisplayInsecureContent(); |
| 257 break; | 274 break; |
| 258 | 275 |
| 259 case ContextTypeBlockable: | 276 case ContextTypeBlockable: |
| 260 allowed = client->allowRunningInsecureContent(settings && settings->allo
wRunningOfInsecureContent(), securityOrigin, url); | 277 allowed = client->allowRunningInsecureContent(settings && settings->allo
wRunningOfInsecureContent(), securityOrigin, url); |
| 261 if (allowed) | 278 if (allowed) |
| 262 client->didRunInsecureContent(securityOrigin, url); | 279 client->didRunInsecureContent(securityOrigin, url); |
| 263 break; | 280 break; |
| 264 | 281 |
| 265 case ContextTypeShouldBeBlockable: | 282 case ContextTypeShouldBeBlockable: |
| 266 return false; | 283 return false; |
| 267 | 284 |
| 268 case ContextTypeBlockableUnlessLax: | 285 case ContextTypeBlockableUnlessLax: |
| 269 // We map this to either OptionallyBlockable or Blockable above. | 286 // We map this to either OptionallyBlockable or Blockable above. |
| 270 ASSERT_NOT_REACHED(); | 287 ASSERT_NOT_REACHED(); |
| 271 return true; | 288 return true; |
| 272 }; | 289 }; |
| 273 | 290 |
| 274 logToConsole(frame, url, resourceRequest.requestContext(), allowed); | 291 // While we use the |effectiveFrame| to grab the settings object, we log the
console error in |
| 292 // |frame|, where the violation actually happened. |
| 293 String message = String::format( |
| 294 "Mixed Content: The page at '%s' was loaded over HTTPS, but requested an
insecure %s '%s'. %s", |
| 295 frame->document()->url().elidedString().utf8().data(), typeNameFromConte
xt(requestContext), url.elidedString().utf8().data(), |
| 296 allowed ? "This content should also be served over HTTPS." : "This reque
st has been blocked; the content must be served over HTTPS."); |
| 297 MessageLevel messageLevel = allowed ? WarningMessageLevel : ErrorMessageLeve
l; |
| 298 frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageS
ource, messageLevel, message)); |
| 299 |
| 275 return !allowed; | 300 return !allowed; |
| 276 } | 301 } |
| 277 | 302 |
| 278 bool MixedContentChecker::canDisplayInsecureContentInternal(SecurityOrigin* secu
rityOrigin, const KURL& url, const MixedContentType type) const | 303 bool MixedContentChecker::canDisplayInsecureContentInternal(SecurityOrigin* secu
rityOrigin, const KURL& url, const MixedContentType type) const |
| 279 { | 304 { |
| 280 // Check the top frame if it differs from MixedContentChecker's m_frame. | 305 // Check the top frame if it differs from MixedContentChecker's m_frame. |
| 281 if (!m_frame->tree().top()->isLocalFrame()) { | 306 if (!m_frame->tree().top()->isLocalFrame()) { |
| 282 // FIXME: We need a way to access the top-level frame's MixedContentChec
ker when that frame | 307 // FIXME: We need a way to access the top-level frame's MixedContentChec
ker when that frame |
| 283 // is in a different process from the current frame. Until that is done,
we always allow | 308 // is in a different process from the current frame. Until that is done,
we always allow |
| 284 // loads in remote frames. | 309 // loads in remote frames. |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 if (Platform::current()->isReservedIPAddress(resourceIP) && !Platform::curre
nt()->isReservedIPAddress(documentIP)) | 431 if (Platform::current()->isReservedIPAddress(resourceIP) && !Platform::curre
nt()->isReservedIPAddress(documentIP)) |
| 407 UseCounter::count(frame->document(), UseCounter::MixedContentPrivateHost
nameInPublicHostname); | 432 UseCounter::count(frame->document(), UseCounter::MixedContentPrivateHost
nameInPublicHostname); |
| 408 } | 433 } |
| 409 | 434 |
| 410 void MixedContentChecker::trace(Visitor* visitor) | 435 void MixedContentChecker::trace(Visitor* visitor) |
| 411 { | 436 { |
| 412 visitor->trace(m_frame); | 437 visitor->trace(m_frame); |
| 413 } | 438 } |
| 414 | 439 |
| 415 } // namespace blink | 440 } // namespace blink |
| OLD | NEW |