Index: chrome/browser/safe_browsing/download_protection_service.cc |
diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc |
index c8f2e7ffdda87f11caeae3bfb15ca9e6205951cb..d562648d3e877118b60152efa6a3e09084a12f88 100644 |
--- a/chrome/browser/safe_browsing/download_protection_service.cc |
+++ b/chrome/browser/safe_browsing/download_protection_service.cc |
@@ -37,6 +37,7 @@ |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/download_item.h" |
#include "content/public/browser/page_navigator.h" |
+#include "crypto/sha2.h" |
#include "google_apis/google_api_keys.h" |
#include "net/base/escape.h" |
#include "net/base/load_flags.h" |
@@ -138,6 +139,22 @@ enum SBStatsType { |
// ALWAYS ADD NEW VALUES BEFORE THIS ONE. |
DOWNLOAD_CHECKS_MAX |
}; |
+ |
+// Prepares URLs to be put into a ping message. Currently this just shortens |
+// data: URIs, other URLs are included verbatim. |
+std::string SanitizeUrl(const GURL& url) { |
+ std::string spec = url.spec(); |
+ if (url.SchemeIs(url::kDataScheme)) { |
+ size_t comma_pos = spec.find(','); |
+ if (comma_pos != std::string::npos && comma_pos != spec.size() - 1) { |
+ std::string hash_value = crypto::SHA256HashString(spec); |
+ spec.erase(comma_pos + 1); |
+ spec += base::HexEncode(hash_value.data(), hash_value.size()); |
+ } |
+ } |
+ return spec; |
+} |
+ |
} // namespace |
// Parent SafeBrowsing::Client class used to lookup the bad binary |
@@ -467,7 +484,8 @@ class DownloadProtectionService::CheckClientDownloadRequest |
*reason = REASON_INVALID_URL; |
return false; |
} |
- if ((!final_url.IsStandard() && !final_url.SchemeIsBlob()) || |
+ if ((!final_url.IsStandard() && !final_url.SchemeIsBlob() && |
+ !final_url.SchemeIs(url::kDataScheme)) || |
final_url.SchemeIsFile()) { |
*reason = REASON_UNSUPPORTED_URL_SCHEME; |
return false; |
@@ -697,16 +715,16 @@ class DownloadProtectionService::CheckClientDownloadRequest |
return; |
ClientDownloadRequest request; |
- request.set_url(item_->GetUrlChain().back().spec()); |
+ request.set_url(SanitizeUrl(item_->GetUrlChain().back())); |
request.mutable_digests()->set_sha256(item_->GetHash()); |
request.set_length(item_->GetReceivedBytes()); |
for (size_t i = 0; i < item_->GetUrlChain().size(); ++i) { |
ClientDownloadRequest::Resource* resource = request.add_resources(); |
- resource->set_url(item_->GetUrlChain()[i].spec()); |
+ resource->set_url(SanitizeUrl(item_->GetUrlChain()[i])); |
if (i == item_->GetUrlChain().size() - 1) { |
// The last URL in the chain is the download URL. |
resource->set_type(ClientDownloadRequest::DOWNLOAD_URL); |
- resource->set_referrer(item_->GetReferrerUrl().spec()); |
+ resource->set_referrer(SanitizeUrl(item_->GetReferrerUrl())); |
DVLOG(2) << "dl url " << resource->url(); |
if (!item_->GetRemoteAddress().empty()) { |
resource->set_remote_ip(item_->GetRemoteAddress()); |
@@ -723,16 +741,16 @@ class DownloadProtectionService::CheckClientDownloadRequest |
for (size_t i = 0; i < tab_redirects_.size(); ++i) { |
ClientDownloadRequest::Resource* resource = request.add_resources(); |
DVLOG(2) << "tab redirect " << i << " " << tab_redirects_[i].spec(); |
- resource->set_url(tab_redirects_[i].spec()); |
+ resource->set_url(SanitizeUrl(tab_redirects_[i])); |
resource->set_type(ClientDownloadRequest::TAB_REDIRECT); |
} |
if (tab_url_.is_valid()) { |
ClientDownloadRequest::Resource* resource = request.add_resources(); |
- resource->set_url(tab_url_.spec()); |
+ resource->set_url(SanitizeUrl(tab_url_)); |
DVLOG(2) << "tab url " << resource->url(); |
resource->set_type(ClientDownloadRequest::TAB_URL); |
if (tab_referrer_url_.is_valid()) { |
- resource->set_referrer(tab_referrer_url_.spec()); |
+ resource->set_referrer(SanitizeUrl(tab_referrer_url_)); |
DVLOG(2) << "tab referrer " << resource->referrer(); |
} |
} |