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

Side by Side Diff: Source/core/fetch/ResourceFetcher.cpp

Issue 47923008: Block execution of failed 'crossorigin' <script>s. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Remove RequestOriginPolicy + suggested improvements Created 7 years, 1 month 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 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 return 0; 258 return 0;
259 } 259 }
260 260
261 FetchContext& ResourceFetcher::context() const 261 FetchContext& ResourceFetcher::context() const
262 { 262 {
263 if (Frame* frame = this->frame()) 263 if (Frame* frame = this->frame())
264 return frame->fetchContext(); 264 return frame->fetchContext();
265 return FetchContext::nullInstance(); 265 return FetchContext::nullInstance();
266 } 266 }
267 267
268 ResourcePtr<Resource> ResourceFetcher::fetchSynchronously(FetchRequest& request) 268 ResourcePtr<Resource> ResourceFetcher::fetchSynchronously(FetchRequest& request, OriginRestriction originRestriction)
269 { 269 {
270 ASSERT(document()); 270 ASSERT(document());
271 request.mutableResourceRequest().setTimeoutInterval(10); 271 request.mutableResourceRequest().setTimeoutInterval(10);
272 ResourceLoaderOptions options(request.options()); 272 ResourceLoaderOptions options(request.options());
273 options.synchronousPolicy = RequestSynchronously; 273 options.synchronousPolicy = RequestSynchronously;
274 request.setOptions(options); 274 request.setOptions(options);
275 return requestResource(Resource::Raw, request); 275 return requestResource(Resource::Raw, request, originRestriction);
276 } 276 }
277 277
278 ResourcePtr<ImageResource> ResourceFetcher::fetchImage(FetchRequest& request) 278 ResourcePtr<ImageResource> ResourceFetcher::fetchImage(FetchRequest& request, Or iginRestriction originRestriction)
279 { 279 {
280 if (Frame* f = frame()) { 280 if (Frame* f = frame()) {
281 if (f->document()->pageDismissalEventBeingDispatched() != Document::NoDi smissal) { 281 if (f->document()->pageDismissalEventBeingDispatched() != Document::NoDi smissal) {
282 KURL requestURL = request.resourceRequest().url(); 282 KURL requestURL = request.resourceRequest().url();
283 if (requestURL.isValid() && canRequest(Resource::Image, requestURL, request.options(), request.forPreload())) 283 if (requestURL.isValid() && canRequest(Resource::Image, requestURL, request.options(), request.forPreload(), originRestriction))
284 PingLoader::loadImage(f, requestURL); 284 PingLoader::loadImage(f, requestURL);
285 return 0; 285 return 0;
286 } 286 }
287 } 287 }
288 288
289 if (request.resourceRequest().url().protocolIsData()) 289 if (request.resourceRequest().url().protocolIsData())
290 preCacheDataURIImage(request); 290 preCacheDataURIImage(request);
291 291
292 request.setDefer(clientDefersImage(request.resourceRequest().url()) ? FetchR equest::DeferredByClient : FetchRequest::NoDefer); 292 request.setDefer(clientDefersImage(request.resourceRequest().url()) ? FetchR equest::DeferredByClient : FetchRequest::NoDefer);
293 return static_cast<ImageResource*>(requestResource(Resource::Image, request) .get()); 293 return static_cast<ImageResource*>(requestResource(Resource::Image, request) .get());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 ResourcePtr<CSSStyleSheetResource> ResourceFetcher::fetchUserCSSStyleSheet(Fetch Request& request) 333 ResourcePtr<CSSStyleSheetResource> ResourceFetcher::fetchUserCSSStyleSheet(Fetch Request& request)
334 { 334 {
335 KURL url = MemoryCache::removeFragmentIdentifierIfNeeded(request.resourceReq uest().url()); 335 KURL url = MemoryCache::removeFragmentIdentifierIfNeeded(request.resourceReq uest().url());
336 336
337 if (Resource* existing = memoryCache()->resourceForURL(url)) { 337 if (Resource* existing = memoryCache()->resourceForURL(url)) {
338 if (existing->type() == Resource::CSSStyleSheet) 338 if (existing->type() == Resource::CSSStyleSheet)
339 return static_cast<CSSStyleSheetResource*>(existing); 339 return static_cast<CSSStyleSheetResource*>(existing);
340 memoryCache()->remove(existing); 340 memoryCache()->remove(existing);
341 } 341 }
342 342
343 request.setOptions(ResourceLoaderOptions(DoNotSendCallbacks, SniffContent, B ufferData, AllowStoredCredentials, ClientRequestedCredentials, AskClientForCross OriginCredentials, SkipSecurityCheck, CheckContentSecurityPolicy, UseDefaultOrig inRestrictionsForType, DocumentContext)); 343 request.setOptions(ResourceLoaderOptions(DoNotSendCallbacks, SniffContent, B ufferData, AllowStoredCredentials, ClientRequestedCredentials, AskClientForCross OriginCredentials, SkipSecurityCheck, CheckContentSecurityPolicy, DocumentContex t));
344 return static_cast<CSSStyleSheetResource*>(requestResource(Resource::CSSStyl eSheet, request).get()); 344 return static_cast<CSSStyleSheetResource*>(requestResource(Resource::CSSStyl eSheet, request).get());
345 } 345 }
346 346
347 ResourcePtr<ScriptResource> ResourceFetcher::fetchScript(FetchRequest& request) 347 ResourcePtr<ScriptResource> ResourceFetcher::fetchScript(FetchRequest& request)
348 { 348 {
349 return static_cast<ScriptResource*>(requestResource(Resource::Script, reques t).get()); 349 return static_cast<ScriptResource*>(requestResource(Resource::Script, reques t).get());
350 } 350 }
351 351
352 ResourcePtr<XSLStyleSheetResource> ResourceFetcher::fetchXSLStyleSheet(FetchRequ est& request) 352 ResourcePtr<XSLStyleSheetResource> ResourceFetcher::fetchXSLStyleSheet(FetchRequ est& request)
353 { 353 {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 Frame* top = f->tree().top(); 422 Frame* top = f->tree().top();
423 if (!top->loader().mixedContentChecker()->canDisplayInsecureContent( top->document()->securityOrigin(), url)) 423 if (!top->loader().mixedContentChecker()->canDisplayInsecureContent( top->document()->securityOrigin(), url))
424 return false; 424 return false;
425 } 425 }
426 } else { 426 } else {
427 ASSERT(treatment == TreatAsAlwaysAllowedContent); 427 ASSERT(treatment == TreatAsAlwaysAllowedContent);
428 } 428 }
429 return true; 429 return true;
430 } 430 }
431 431
432 bool ResourceFetcher::canRequest(Resource::Type type, const KURL& url, const Res ourceLoaderOptions& options, bool forPreload) 432 bool ResourceFetcher::canRequest(Resource::Type type, const KURL& url, const Res ourceLoaderOptions& options, bool forPreload, OriginRestriction originRestrictio n)
433 { 433 {
434 if (document() && !document()->securityOrigin()->canDisplay(url)) { 434 if (document() && !document()->securityOrigin()->canDisplay(url)) {
435 if (!forPreload) 435 if (!forPreload)
436 context().reportLocalLoadFailed(url); 436 context().reportLocalLoadFailed(url);
437 LOG(ResourceLoading, "ResourceFetcher::requestResource URL was not allow ed by SecurityOrigin::canDisplay"); 437 LOG(ResourceLoading, "ResourceFetcher::requestResource URL was not allow ed by SecurityOrigin::canDisplay");
438 return 0; 438 return 0;
439 } 439 }
440 440
441 // FIXME: Convert this to check the isolated world's Content Security Policy once webkit.org/b/104520 is solved. 441 // FIXME: Convert this to check the isolated world's Content Security Policy once webkit.org/b/104520 is solved.
442 bool shouldBypassMainWorldContentSecurityPolicy = (frame() && frame()->scrip t().shouldBypassMainWorldContentSecurityPolicy()) || (options.contentSecurityPol icyOption == DoNotCheckContentSecurityPolicy); 442 bool shouldBypassMainWorldContentSecurityPolicy = (frame() && frame()->scrip t().shouldBypassMainWorldContentSecurityPolicy()) || (options.contentSecurityPol icyOption == DoNotCheckContentSecurityPolicy);
443 443
444 // Some types of resources can be loaded only from the same origin. Other 444 // Some types of resources can be loaded only from the same origin. Other
445 // types of resources, like Images, Scripts, and CSS, can be loaded from 445 // types of resources, like Images, Scripts, and CSS, can be loaded from
446 // any URL. 446 // any URL.
447 switch (type) { 447 switch (type) {
448 case Resource::MainResource: 448 case Resource::MainResource:
449 case Resource::Image: 449 case Resource::Image:
450 case Resource::CSSStyleSheet: 450 case Resource::CSSStyleSheet:
451 case Resource::Script: 451 case Resource::Script:
452 case Resource::Font: 452 case Resource::Font:
453 case Resource::Raw: 453 case Resource::Raw:
454 case Resource::LinkPrefetch: 454 case Resource::LinkPrefetch:
455 case Resource::LinkSubresource: 455 case Resource::LinkSubresource:
456 case Resource::TextTrack: 456 case Resource::TextTrack:
457 case Resource::Shader: 457 case Resource::Shader:
458 case Resource::ImportResource: 458 case Resource::ImportResource:
459 // By default these types of resources can be loaded from any origin. 459 // By default these types of resources can be loaded from any origin.
460 // FIXME: Are we sure about Resource::Font? 460 // FIXME: Are we sure about Resource::Font?
461 if (options.requestOriginPolicy == RestrictToSameOrigin && !m_document-> securityOrigin()->canRequest(url)) { 461 if (originRestriction == RestrictToSameOrigin && !m_document->securityOr igin()->canRequest(url)) {
462 printAccessDeniedMessage(url); 462 printAccessDeniedMessage(url);
463 return false; 463 return false;
464 } 464 }
465 break; 465 break;
466 case Resource::XSLStyleSheet: 466 case Resource::XSLStyleSheet:
467 ASSERT(RuntimeEnabledFeatures::xsltEnabled()); 467 ASSERT(RuntimeEnabledFeatures::xsltEnabled());
468 case Resource::SVGDocument: 468 case Resource::SVGDocument:
469 if (!m_document->securityOrigin()->canRequest(url)) { 469 if (!m_document->securityOrigin()->canRequest(url)) {
470 printAccessDeniedMessage(url); 470 printAccessDeniedMessage(url);
471 return false; 471 return false;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 // folks block insecure content with a CSP policy, they don't get a warning. 525 // folks block insecure content with a CSP policy, they don't get a warning.
526 // They'll still get a warning in the console about CSP blocking the load. 526 // They'll still get a warning in the console about CSP blocking the load.
527 527
528 // FIXME: Should we consider forPreload here? 528 // FIXME: Should we consider forPreload here?
529 if (!checkInsecureContent(type, url, options.mixedContentBlockingTreatment)) 529 if (!checkInsecureContent(type, url, options.mixedContentBlockingTreatment))
530 return false; 530 return false;
531 531
532 return true; 532 return true;
533 } 533 }
534 534
535 bool ResourceFetcher::canAccess(Resource* resource) 535 bool ResourceFetcher::canAccess(Resource* resource, CrossOriginEnabled crossOrig inEnabled, OriginRestriction originRestriction)
536 { 536 {
537 // Redirects can change the response URL different from one of request. 537 // Redirects can change the response URL different from one of request.
538 if (!canRequest(resource->type(), resource->response().url(), resource->opti ons(), false)) 538 if (!canRequest(resource->type(), resource->response().url(), resource->opti ons(), false, originRestriction))
539 return false; 539 return false;
540 540
541 String error; 541 String error;
542 switch (resource->type()) { 542 switch (resource->type()) {
543 case Resource::Script: 543 case Resource::Script:
544 case Resource::ImportResource: 544 case Resource::ImportResource:
545 if (resource->options().requestOriginPolicy == PotentiallyCrossOriginEna bled 545 if (crossOriginEnabled == PotentiallyCrossOriginEnabled
546 && !m_document->securityOrigin()->canRequest(resource->response().ur l()) 546 && !m_document->securityOrigin()->canRequest(resource->response().ur l())
547 && !resource->passesAccessControlCheck(m_document->securityOrigin(), error)) { 547 && !resource->passesAccessControlCheck(m_document->securityOrigin(), error)) {
548 if (frame() && frame()->document()) 548 if (frame() && frame()->document())
549 frame()->document()->addConsoleMessage(JSMessageSource, ErrorMes sageLevel, "Script from origin '" + SecurityOrigin::create(resource->response(). url())->toString() + "' has been blocked from loading by Cross-Origin Resource S haring policy: " + error); 549 frame()->document()->addConsoleMessage(JSMessageSource, ErrorMes sageLevel, "Script from origin '" + SecurityOrigin::create(resource->response(). url())->toString() + "' has been blocked from loading by Cross-Origin Resource S haring policy: " + error);
550 return false; 550 return false;
551 } 551 }
552 552
553 break; 553 break;
554 default: 554 default:
555 ASSERT_NOT_REACHED(); // FIXME: generalize to non-script resources 555 ASSERT_NOT_REACHED(); // FIXME: generalize to non-script resources
(...skipping 16 matching lines...) Expand all
572 { 572 {
573 if (FetchRequest::DeferredByClient == request.defer()) 573 if (FetchRequest::DeferredByClient == request.defer())
574 return false; 574 return false;
575 if (policy != Use) 575 if (policy != Use)
576 return true; 576 return true;
577 if (resource->stillNeedsLoad()) 577 if (resource->stillNeedsLoad())
578 return true; 578 return true;
579 return request.options().synchronousPolicy == RequestSynchronously && resour ce->isLoading(); 579 return request.options().synchronousPolicy == RequestSynchronously && resour ce->isLoading();
580 } 580 }
581 581
582 ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, Fetc hRequest& request) 582 ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, Fetc hRequest& request, OriginRestriction originRestriction)
583 { 583 {
584 ASSERT(request.options().synchronousPolicy == RequestAsynchronously || type == Resource::Raw); 584 ASSERT(request.options().synchronousPolicy == RequestAsynchronously || type == Resource::Raw);
585 585
586 KURL url = request.resourceRequest().url(); 586 KURL url = request.resourceRequest().url();
587 587
588 LOG(ResourceLoading, "ResourceFetcher::requestResource '%s', charset '%s', p riority=%d, forPreload=%u, type=%s", url.elidedString().latin1().data(), request .charset().latin1().data(), request.priority(), request.forPreload(), ResourceTy peName(type)); 588 LOG(ResourceLoading, "ResourceFetcher::requestResource '%s', charset '%s', p riority=%d, forPreload=%u, type=%s", url.elidedString().latin1().data(), request .charset().latin1().data(), request.priority(), request.forPreload(), ResourceTy peName(type));
589 589
590 // If only the fragment identifiers differ, it is the same resource. 590 // If only the fragment identifiers differ, it is the same resource.
591 url = MemoryCache::removeFragmentIdentifierIfNeeded(url); 591 url = MemoryCache::removeFragmentIdentifierIfNeeded(url);
592 592
593 if (!url.isValid()) 593 if (!url.isValid())
594 return 0; 594 return 0;
595 595
596 if (!canRequest(type, url, request.options(), request.forPreload())) 596 if (!canRequest(type, url, request.options(), request.forPreload(), originRe striction))
597 return 0; 597 return 0;
598 598
599 if (Frame* f = frame()) 599 if (Frame* f = frame())
600 f->loader().client()->dispatchWillRequestResource(&request); 600 f->loader().client()->dispatchWillRequestResource(&request);
601 601
602 // See if we can use an existing resource from the cache. 602 // See if we can use an existing resource from the cache.
603 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url); 603 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url);
604 604
605 const RevalidationPolicy policy = determineRevalidationPolicy(type, request. mutableResourceRequest(), request.forPreload(), resource.get(), request.defer()) ; 605 const RevalidationPolicy policy = determineRevalidationPolicy(type, request. mutableResourceRequest(), request.forPreload(), resource.get(), request.defer()) ;
606 switch (policy) { 606 switch (policy) {
(...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after
1254 return false; 1254 return false;
1255 } 1255 }
1256 1256
1257 bool ResourceFetcher::isLoadedBy(ResourceLoaderHost* possibleOwner) const 1257 bool ResourceFetcher::isLoadedBy(ResourceLoaderHost* possibleOwner) const
1258 { 1258 {
1259 return this == possibleOwner; 1259 return this == possibleOwner;
1260 } 1260 }
1261 1261
1262 bool ResourceFetcher::shouldRequest(Resource* resource, const ResourceRequest& r equest, const ResourceLoaderOptions& options) 1262 bool ResourceFetcher::shouldRequest(Resource* resource, const ResourceRequest& r equest, const ResourceLoaderOptions& options)
1263 { 1263 {
1264 if (!canRequest(resource->type(), request.url(), options)) 1264 if (!canRequest(resource->type(), request.url(), options, false, UseDefaultO riginRestrictionForType))
1265 return false; 1265 return false;
1266 if (resource->type() == Resource::Image && shouldDeferImageLoad(request.url( ))) 1266 if (resource->type() == Resource::Image && shouldDeferImageLoad(request.url( )))
1267 return false; 1267 return false;
1268 return true; 1268 return true;
1269 } 1269 }
1270 1270
1271 void ResourceFetcher::refResourceLoaderHost() 1271 void ResourceFetcher::refResourceLoaderHost()
1272 { 1272 {
1273 ref(); 1273 ref();
1274 } 1274 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1322 printf("SCRIPTS: %d (%d hits, hit rate %d%%)\n", scripts, scripts - scri ptMisses, (scripts - scriptMisses) * 100 / scripts); 1322 printf("SCRIPTS: %d (%d hits, hit rate %d%%)\n", scripts, scripts - scri ptMisses, (scripts - scriptMisses) * 100 / scripts);
1323 if (stylesheets) 1323 if (stylesheets)
1324 printf("STYLESHEETS: %d (%d hits, hit rate %d%%)\n", stylesheets, styles heets - stylesheetMisses, (stylesheets - stylesheetMisses) * 100 / stylesheets); 1324 printf("STYLESHEETS: %d (%d hits, hit rate %d%%)\n", stylesheets, styles heets - stylesheetMisses, (stylesheets - stylesheetMisses) * 100 / stylesheets);
1325 if (images) 1325 if (images)
1326 printf("IMAGES: %d (%d hits, hit rate %d%%)\n", images, images - imageM isses, (images - imageMisses) * 100 / images); 1326 printf("IMAGES: %d (%d hits, hit rate %d%%)\n", images, images - imageM isses, (images - imageMisses) * 100 / images);
1327 } 1327 }
1328 #endif 1328 #endif
1329 1329
1330 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions() 1330 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions()
1331 { 1331 {
1332 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (SendCallbacks, SniffCon tent, BufferData, AllowStoredCredentials, ClientRequestedCredentials, AskClientF orCrossOriginCredentials, DoSecurityCheck, CheckContentSecurityPolicy, UseDefaul tOriginRestrictionsForType, DocumentContext)); 1332 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (SendCallbacks, SniffCon tent, BufferData, AllowStoredCredentials, ClientRequestedCredentials, AskClientF orCrossOriginCredentials, DoSecurityCheck, CheckContentSecurityPolicy, DocumentC ontext));
1333 return options; 1333 return options;
1334 } 1334 }
1335 1335
1336 } 1336 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698