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

Unified Diff: chrome/browser/safe_browsing/client_side_detection_host.cc

Issue 7408001: If we show a SafeBrowsing warning we always send the client-side detection (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Created 9 years, 5 months 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/safe_browsing/client_side_detection_host.cc
diff --git a/chrome/browser/safe_browsing/client_side_detection_host.cc b/chrome/browser/safe_browsing/client_side_detection_host.cc
index 2b2d1db3cc9d873cc9e95fac77f4d487241ed463..718d1ece02b5e7c5b03c8c859ccf00db542d45ad 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_host.cc
@@ -269,7 +269,8 @@ ClientSideDetectionHost* ClientSideDetectionHost::Create(
ClientSideDetectionHost::ClientSideDetectionHost(TabContents* tab)
: TabContentsObserver(tab),
csd_service_(NULL),
- cb_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
+ cb_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
+ unsafe_unique_page_id_(-1) {
DCHECK(tab);
csd_service_ = g_browser_process->safe_browsing_detection_service();
feature_extractor_.reset(new BrowserFeatureExtractor(tab, csd_service_));
@@ -277,15 +278,22 @@ ClientSideDetectionHost::ClientSideDetectionHost(TabContents* tab)
// Note: csd_service_ and sb_service_ will be NULL here in testing.
registrar_.Add(this, content::NOTIFICATION_RESOURCE_RESPONSE_STARTED,
Source<RenderViewHostDelegate>(tab));
+ if (sb_service_) {
+ sb_service_->AddObserver(this);
+ }
}
-ClientSideDetectionHost::~ClientSideDetectionHost() {}
+ClientSideDetectionHost::~ClientSideDetectionHost() {
+ if (sb_service_) {
+ sb_service_->RemoveObserver(this);
+ }
+}
bool ClientSideDetectionHost::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(ClientSideDetectionHost, message)
- IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_DetectedPhishingSite,
- OnDetectedPhishingSite)
+ IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_PhishingDetectionDone,
+ OnPhishingDetectionDone)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
@@ -332,6 +340,26 @@ void ClientSideDetectionHost::DidNavigateMainFramePostCommit(
classification_request_->Start();
}
+void ClientSideDetectionHost::OnSafeBrowsingHit(
+ const SafeBrowsingService::UnsafeResource& resource) {
+ // Check that this notification is really for us and that it corresponds to
+ // either a malware or phishing hit. In this case we store the unique page
+ // ID and store it for later. For phishing hits we also require that the
Garrett Casto 2011/07/19 21:18:48 The "In this case ..." sentence seems to have two
noelutz 2011/07/19 22:28:08 Removed the top level phishing check. We can chec
+ // top level URL match the phishing list.
+ if (tab_contents() &&
+ tab_contents()->GetRenderProcessHost()->id() ==
+ resource.render_process_host_id &&
+ tab_contents()->render_view_host()->routing_id() ==
+ resource.render_view_id &&
+ ((resource.threat_type == SafeBrowsingService::URL_PHISHING &&
+ !resource.is_subresource) ||
+ resource.threat_type == SafeBrowsingService::URL_MALWARE) &&
+ tab_contents()->controller().GetActiveEntry()) {
+ unsafe_unique_page_id_ =
+ tab_contents()->controller().GetActiveEntry()->unique_id();
+ }
+}
+
void ClientSideDetectionHost::TabContentsDestroyed(TabContents* tab) {
DCHECK(tab);
// Tell any pending classification request that it is being canceled.
@@ -342,7 +370,7 @@ void ClientSideDetectionHost::TabContentsDestroyed(TabContents* tab) {
feature_extractor_.reset();
}
-void ClientSideDetectionHost::OnDetectedPhishingSite(
+void ClientSideDetectionHost::OnPhishingDetectionDone(
const std::string& verdict_str) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
// There is something seriously wrong if there is no service class but
@@ -361,7 +389,12 @@ void ClientSideDetectionHost::OnDetectedPhishingSite(
!cb_factory_.HasPendingCallbacks() &&
browse_info_.get() &&
verdict->ParseFromString(verdict_str) &&
- verdict->IsInitialized()) {
+ verdict->IsInitialized() &&
+ // We only send the verdict to the server if the verdict is phishing or if
+ // a SafeBrowsing interstitial was already shown for this site. E.g., a
+ // malware or phishing interstitial was shown but the user clicked
+ // through.
+ (verdict->is_phishing() || DidShowSBInterstitial())) {
if (browse_info_->url.spec() != verdict->url()) {
// I'm not sure we can DCHECK on this one so we keep stats around to see
// whether this actually happens in practice.
@@ -416,11 +449,17 @@ void ClientSideDetectionHost::FeatureExtractionDone(
}
VLOG(2) << "Feature extraction done (success:" << success << ") for URL: "
<< request->url() << ". Start sending client phishing request.";
- // Send ping no matter what - even if the browser feature extraction failed.
+ ClientSideDetectionService::ClientReportPhishingRequestCallback* cb = NULL;
+ // If the client-side verdict isn't phishing we don't care about the server
+ // response because we aren't going to display a warning.
+ if (request->is_phishing()) {
Garrett Casto 2011/07/19 21:18:48 So we probably don't want to show a warning if we
noelutz 2011/07/19 22:28:08 I already implemented that a while back in the Saf
+ cb = cb_factory_.NewCallback(
+ &ClientSideDetectionHost::MaybeShowPhishingWarning);
+ }
+ // Send ping even if the browser feature extraction failed.
csd_service_->SendClientReportPhishingRequest(
request, // The service takes ownership of the request object.
- cb_factory_.NewCallback(
- &ClientSideDetectionHost::MaybeShowPhishingWarning));
+ cb);
}
void ClientSideDetectionHost::Observe(int type,
@@ -435,6 +474,14 @@ void ClientSideDetectionHost::Observe(int type,
}
}
+bool ClientSideDetectionHost::DidShowSBInterstitial() {
+ return (unsafe_unique_page_id_ > 0 &&
+ tab_contents() &&
+ tab_contents()->controller().GetActiveEntry() &&
+ tab_contents()->controller().GetActiveEntry()->unique_id() ==
Brian Ryner 2011/07/19 21:27:10 You could avoid some of the repetition in this met
noelutz 2011/07/19 22:28:08 Done.
+ unsafe_unique_page_id_);
+}
+
void ClientSideDetectionHost::set_client_side_detection_service(
ClientSideDetectionService* service) {
csd_service_ = service;
@@ -442,7 +489,13 @@ void ClientSideDetectionHost::set_client_side_detection_service(
void ClientSideDetectionHost::set_safe_browsing_service(
SafeBrowsingService* service) {
+ if (sb_service_) {
+ sb_service_->RemoveObserver(this);
+ }
sb_service_ = service;
+ if (sb_service_) {
+ sb_service_->AddObserver(this);
+ }
}
} // namespace safe_browsing

Powered by Google App Engine
This is Rietveld 408576698