Index: chrome/browser/safe_browsing/client_side_detection_service.cc |
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc |
index 16773536f63c50d4097dac829d45e062c6c492f0..30c5deed7a63ff498b95fbba06ce7952c8286bb6 100644 |
--- a/chrome/browser/safe_browsing/client_side_detection_service.cc |
+++ b/chrome/browser/safe_browsing/client_side_detection_service.cc |
@@ -10,13 +10,18 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/message_loop.h" |
#include "base/metrics/histogram.h" |
+#include "base/string_util.h" |
#include "base/stl_util.h" |
#include "base/task.h" |
#include "base/time.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/safe_browsing/browser_features.h" |
+#include "chrome/browser/safe_browsing/safe_browsing_service.h" |
#include "chrome/common/net/http_return.h" |
#include "chrome/common/safe_browsing/client_model.pb.h" |
#include "chrome/common/safe_browsing/csd.pb.h" |
#include "chrome/common/safe_browsing/safebrowsing_messages.h" |
+#include "chrome/renderer/safe_browsing/features.h" |
#include "content/browser/browser_thread.h" |
#include "content/browser/renderer_host/render_process_host.h" |
#include "content/common/notification_service.h" |
@@ -64,8 +69,10 @@ ClientSideDetectionService::CacheState::CacheState(bool phish, base::Time time) |
ClientSideDetectionService::ClientSideDetectionService( |
net::URLRequestContextGetter* request_context_getter) |
: enabled_(false), |
+ sb_service_(g_browser_process->safe_browsing_service()), |
ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), |
request_context_getter_(request_context_getter) { |
+ InitializeAllowedFeatures(); |
registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED, |
NotificationService::AllSources()); |
} |
@@ -266,6 +273,40 @@ void ClientSideDetectionService::EndFetchModel(ClientModelStatus status) { |
ScheduleFetchModel(delay_ms); |
} |
+void ClientSideDetectionService::SanitizeRequestForPingback( |
+ const ClientPhishingRequest& full_request, |
+ ClientPhishingRequest* sanitized_request) { |
+ DCHECK(full_request.IsInitialized()); |
+ sanitized_request->Clear(); |
+ if (full_request.has_suffix_prefix_hash()) { |
+ sanitized_request->set_suffix_prefix_hash( |
+ full_request.suffix_prefix_hash()); |
+ } |
+ sanitized_request->set_client_score(full_request.client_score()); |
+ if (full_request.has_is_phishing()) { |
+ sanitized_request->set_is_phishing(full_request.is_phishing()); |
+ } |
+ |
+ for (int i = 0; i < full_request.feature_map_size(); ++i) { |
+ const ClientPhishingRequest_Feature& feature = full_request.feature_map(i); |
+ if (allowed_features_.find(feature.name()) != allowed_features_.end()) { |
+ sanitized_request->add_feature_map()->CopyFrom(feature); |
+ } |
+ } |
+ |
+ if (full_request.has_model_version()) { |
+ sanitized_request->set_model_version(full_request.model_version()); |
+ } |
+ |
+ for (int i = 0; i < full_request.non_model_feature_map_size(); ++i) { |
+ const ClientPhishingRequest_Feature& feature = |
+ full_request.non_model_feature_map(i); |
+ if (allowed_features_.find(feature.name()) != allowed_features_.end()) { |
+ sanitized_request->add_non_model_feature_map()->CopyFrom(feature); |
+ } |
+ } |
+} |
+ |
void ClientSideDetectionService::StartClientReportPhishingRequest( |
ClientPhishingRequest* verdict, |
ClientReportPhishingRequestCallback* callback) { |
@@ -279,8 +320,16 @@ void ClientSideDetectionService::StartClientReportPhishingRequest( |
return; |
} |
+ // Create the version of the request proto that we'll send over the network. |
+ ClientPhishingRequest request_to_send; |
+ if (sb_service_ && sb_service_->CanReportStats()) { |
+ request_to_send.CopyFrom(*request); |
+ } else { |
+ SanitizeRequestForPingback(*request, &request_to_send); |
+ } |
+ |
std::string request_data; |
- if (!request->SerializeToString(&request_data)) { |
+ if (!request_to_send.SerializeToString(&request_data)) { |
UMA_HISTOGRAM_COUNTS("SBClientPhishing.RequestNotSerialized", 1); |
VLOG(1) << "Unable to serialize the CSD request. Proto file changed?"; |
if (cb.get()) { |
@@ -470,6 +519,44 @@ bool ClientSideDetectionService::InitializePrivateNetworks() { |
return true; |
} |
+void ClientSideDetectionService::InitializeAllowedFeatures() { |
+ static const char* const kAllowedFeatures[] = { |
+ // Renderer (model) features. |
+ features::kUrlHostIsIpAddress, |
+ features::kUrlNumOtherHostTokensGTOne, |
+ features::kUrlNumOtherHostTokensGTThree, |
+ features::kPageHasForms, |
+ features::kPageActionOtherDomainFreq, |
+ features::kPageHasTextInputs, |
+ features::kPageHasPswdInputs, |
+ features::kPageHasRadioInputs, |
+ features::kPageHasCheckInputs, |
+ features::kPageExternalLinksFreq, |
+ features::kPageSecureLinksFreq, |
+ features::kPageNumScriptTagsGTOne, |
+ features::kPageNumScriptTagsGTSix, |
+ features::kPageImgOtherDomainFreq, |
+ // Browser (non-model) features. |
+ features::kUrlHistoryVisitCount, |
+ features::kUrlHistoryTypedCount, |
+ features::kUrlHistoryLinkCount, |
+ features::kUrlHistoryVisitCountMoreThan24hAgo, |
+ features::kHttpHostVisitCount, |
+ features::kHttpsHostVisitCount, |
+ features::kFirstHttpHostVisitMoreThan24hAgo, |
+ features::kFirstHttpsHostVisitMoreThan24hAgo, |
+ features::kHasSSLReferrer, |
+ features::kPageTransitionType, |
+ features::kIsFirstNavigation, |
+ features::kSafeBrowsingIsSubresource, |
+ features::kSafeBrowsingThreatType, |
+ }; |
+ |
+ for (size_t i = 0; i < arraysize(kAllowedFeatures); ++i) { |
+ allowed_features_.insert(kAllowedFeatures[i]); |
+ } |
+} |
+ |
// static |
void ClientSideDetectionService::SetBadSubnets(const ClientSideModel& model, |
BadSubnetMap* bad_subnets) { |