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

Side by Side Diff: components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h

Issue 338483002: Chrome Participated Tamper Detect (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_TAMPER_DETE CT_H_
6 #define COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_TAMPER_DETE CT_H_
7
8 #include <map>
9
10 #include "net/http/http_response_headers.h"
bengr 2014/07/02 17:31:01 add: namespace net { class HttpResponseHeaders; }
xingx 2014/07/06 03:18:19 Done.
11
12 namespace data_reduction_proxy {
13
14 // There are two fingerprints will be added to Chrome-Proxy header.
bengr 2014/07/02 17:31:00 Remove "There are"
xingx 2014/07/06 03:18:19 Done.
15 // One starts with |kTamperDetectFingerprintChromeProxy|, which is the
16 // fingerprint for Chrome-Proxy header.
17 // The other one starts with |kTamperDetectFingerprint|, which includes
18 // all other fingerprints.
19 const char kTamperDetectFingerprint[] = "fp=";
20 const char kTamperDetectFingerprintChromeProxy[] = "cp=";
21
22 // In fingerprint starts with |kTamperDetectFingerprint|, it contains multiple
bengr 2014/07/02 17:31:00 "In" --> "If |kTamperDetectFingerprint| contains
xingx 2014/07/06 03:18:19 Done.
23 // fingerprints, each starts with a tag followed by "=" and its fingerprint
24 // value. Currently we have 3 of fingerprints and thus 3 tags, defined below.
bengr 2014/07/02 17:30:59 Currently --> Three fingerprints and their respect
xingx 2014/07/06 03:18:19 Done.
25 const char kTamperDetectFingerprintVia[] = "via";
bengr 2014/07/02 17:31:00 Are these needed outside the class? If not, define
xingx 2014/07/06 03:18:19 Done.
26 const char kTamperDetectFingerprintOther[] = "oh";
27 const char kTamperDetectFingerprintContengLength[] = "cl";
28
29 // Macro for UMA report.
bengr 2014/07/02 17:30:59 Why is this in the .h?
xingx 2014/07/06 03:18:19 Done.
30 // If |is_secure_scheme| is true, report to |HTTPS_histogram|,
31 // otherwise report to |HTTP_histogram|.
32 // Both's bucket are Carrier IDs |mcc_mnc|.
33 // The other histogram counts the total number, |HTTP(S)_histogram| "_Total".
34 // which only has one bucket, 0.
35 #define UMA_REPORT(is_secure_scheme, HTTP_histogram, HTTPS_histogram, mcc_mnc) \
bengr 2014/07/02 17:31:00 Unless you've seen this pattern in other UMA repor
xingx 2014/07/06 03:18:20 Done.
36 do { \
37 if (is_secure_scheme) { \
bengr 2014/07/02 17:31:00 Is the scheme always https if |is_secure_scheme| i
xingx 2014/07/06 03:18:19 Done.
38 UMA_HISTOGRAM_SPARSE_SLOWLY(HTTPS_histogram, mcc_mnc); \
39 UMA_HISTOGRAM_SPARSE_SLOWLY(HTTPS_histogram "_Total", 0); \
bolian 2014/07/02 23:47:37 Should use UMA_HISTOGRAM_COUNTS here.
xingx 2014/07/06 03:18:19 Done.
40 } else { \
41 UMA_HISTOGRAM_SPARSE_SLOWLY(HTTP_histogram, mcc_mnc); \
42 UMA_HISTOGRAM_SPARSE_SLOWLY(HTTP_histogram "_Total", 0); \
bolian 2014/07/02 23:47:37 same here, UMA_HISTOGRAM_COUNTS
xingx 2014/07/06 03:18:19 Done.
43 }\
44 } while (0)
45
46 // Utility function, exposed for unittest.
47 // Return MD5 value for a given string |input|.
48 std::string GetMD5(const std::string& input);
bengr 2014/07/02 17:31:00 I don't think you should expose such a function to
xingx 2014/07/06 03:18:19 Done.
49
50 // Utility function, exposed for unittest.
51 // Return all the values of a header field |header_name| of the
52 // response header |headers|, as a vector.
53 std::vector<std::string> GetHeaderValues(
bengr 2014/07/02 17:31:00 Do you really need this? HttpResponseHeaders parse
xingx 2014/07/06 03:18:19 Discussed with you, reason is I need to sort the v
54 const net::HttpResponseHeaders* headers, const std::string& header_name);
55
56 // Utility function, exposed for unittest.
57 // Check whether values of a header field |values| contains the Chrome-Proxy
58 // header's fingerprint (starts with |kTamperDetectFingerprintChromeProxy|).
59 // If there is, return true, and save Chrome-Proxy header's fingerprint to
60 // |chrome_proxy_fingerprint|;
61 // and save other fingerprints (starts with |kTamperDetectFingerprintOther|)
62 // to |other_fingerprints|.
63 // Return false if there is no Chrome-Proxy header's fingerprint found.
64 bool ContainsTamperDetectFingerprints(std::vector<std::string>& values,
bengr 2014/07/02 17:31:00 Don't use non-const references.
xingx 2014/07/06 03:18:19 The function checks whether there is chrome-proxy
65 std::string& chrome_proxy_fingerprint,
66 std::string& other_fingerprints);
67
68 // The main function for detecting tamper.
bengr 2014/07/02 17:31:00 Fill out comments to the 80-char limit.
xingx 2014/07/06 03:18:19 Done.
69 // It takes two parameters as input,
70 // 1. a pointer to HttpResponseHeaders,
71 // 2. a boolean variable indicates whether the connection
72 // between Chrome and data reduction proxy is on HTTPS or not.
73 // For such response, the function checks whether there is a tamper detect
74 // request (contains fingerprints) from data reduction proxy, if so, it checks
75 // whether there are tampers and report the results to UMA.
76 void CheckResponseFingerprint(const net::HttpResponseHeaders*, const bool);
77
78
79
80 // The class for detecting tamper.
81 // It wraps up the functionalities for tamper detection.
82 // For each fingerprint, we need to implement two functions:
83 // * checking function: returns tamper or not for such fingerprint;
84 // (function name starts with Check...)
85 // * reporting function: reporting results to corresponding UMA
86 // when there are tampers detected.
87 // (function name starts with Report...)
88 class DataReductionProxyTamperDetect {
89 public:
90 DataReductionProxyTamperDetect(const net::HttpResponseHeaders*, const bool,
91 const unsigned, std::vector<std::string>*);
92 virtual ~DataReductionProxyTamperDetect();
93
94 // For Chrome-Proxy header tamper detection...
bolian 2014/07/02 23:47:37 Let's simplify and reformat the doc of this func a
xingx 2014/07/06 03:18:20 Done.
95 // Check whether values of data reduction proxy's header Chrome-Proxy
96 // have been tampered or not.
97 // It takes one parameters as input,
98 // 1. fingerprint received from data reduction proxy
99 // Returns true if it has been tampered.
100 bool CheckHeaderChromeProxy(const std::string&);
bengr 2014/07/02 17:31:00 Can this function be const? What about others belo
xingx 2014/07/06 03:18:19 Done.
101
102 // For Via header tamper detection...
bengr 2014/07/02 17:31:00 Use complete sentences in comments.
xingx 2014/07/06 03:18:19 Done.
103 // Check whether there are proxies/middleboxes between Chrome
104 // It takes one parameters as input,
105 // 1. fingerprint received from data reduction proxy
106 // Returns true if there are.
107 bool CheckHeaderVia(const std::string&);
bengr 2014/07/02 17:30:59 What does this function do?
xingx 2014/07/06 03:18:19 Done.
108 // Reporting function for Via header tampering.
109 void ReportHeaderVia();
110
111 // For other headers tamper detection...
112 // Check whether values of a predefined list of headers have been tampered.
113 // It takes one parameters as input,
114 // 1. fingerprint received from data reduction proxy
115 // Returns true if tamper detected for these headers.
116 bool CheckHeaderOtherHeaders(const std::string&);
117 // Reporting function for tampering of values of the list of headers.
118 void ReportHeaderOtherHeaders();
119
120 // For Content-Length tamper detection...
121 // Check whether the Content-Length value is different from what
122 // data reduction proxy sees. This is an indicator that the response body
123 // have been modified.
124 // It takes one parameters as input,
125 // 1. fingerprint received from data reduction proxy
126 // Returns true if different Content-Length value is observed.
127 bool CheckHeaderContentLength(const std::string&);
128 // Reporting function for Content-Length tamper detected.
129 void ReportHeaderContentLength();
130
131
132 // Function calls checking and reporting function for tamper detect.
133 // (i.e., above defined function pairs)
134 // Fingerprint type is specified by fingerprint name |key|
135 // (e.g., |kTamperDetectFingerprintVia|), and fingerprint from
136 // data reduction proxy is |fingerprint|.
137 // call it's corresponding check function as well as report function,
138 void CheckReportFingerprint(const std::string& key,
139 const std::string& fingerprint);
140
141
142 // Function pointer to checking function.
143 typedef bool (DataReductionProxyTamperDetect::*CheckTamper)(
bengr 2014/07/02 17:31:00 Why do you need function pointers?
xingx 2014/07/06 03:18:19 removed.
144 const std::string&);
145
146 // Function pointer to reporting function.
147 typedef void (DataReductionProxyTamperDetect::*ReportTamper)();
148
149 // Struct contains a pair of function pointers for one fingerprint:
150 // checking function pointer and one reporting function pointer.
151 struct CheckReportFuncs {
152 CheckTamper check_tamper_func;
bengr 2014/07/02 17:31:00 variable names should not be abbreviated. E.g., th
xingx 2014/07/06 03:18:19 Done.
153 ReportTamper report_tamper_func;
154 };
155
156 private:
157 // Response header.
158 const net::HttpResponseHeaders* response_headers;
bengr 2014/07/02 17:31:00 Add a blank line after each variable.
xingx 2014/07/06 03:18:19 Done.
159 // HTTPS or HTTP.
160 const bool is_secure_scheme;
161 // Carrier ID.
162 const unsigned mcc_mnc;
163 // Values for Chrome-Proxy header, with |kTamperDetectFingerprintChromeProxy|
164 // removed. Save it as temporary result so we don't need to parse
165 // Chrome-Proxy header twice.
166 std::vector<std::string>* clean_chrome_proxy_header_values;
167 // The checking function and reporting function pointers map, which maps
168 // a fingerprint name to |CheckReportFuncs| which contains pointers to
169 // corresponding checking function and reporting function.
170 std::map<std::string, CheckReportFuncs> check_report_func_map;
171 };
172
173 } // namespace data_reduction_proxy
174 #endif // COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_TAMPER_D ETECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698