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

Side by Side Diff: net/url_request/url_request.cc

Issue 1017583002: Set Origin header to "null" for cross origin redirects. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Rebase on ToT Created 5 years, 9 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/url_request/url_request.h" 5 #include "net/url_request/url_request.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 19 matching lines...) Expand all
30 #include "net/http/http_response_headers.h" 30 #include "net/http/http_response_headers.h"
31 #include "net/http/http_util.h" 31 #include "net/http/http_util.h"
32 #include "net/ssl/ssl_cert_request_info.h" 32 #include "net/ssl/ssl_cert_request_info.h"
33 #include "net/url_request/redirect_info.h" 33 #include "net/url_request/redirect_info.h"
34 #include "net/url_request/url_request_context.h" 34 #include "net/url_request/url_request_context.h"
35 #include "net/url_request/url_request_error_job.h" 35 #include "net/url_request/url_request_error_job.h"
36 #include "net/url_request/url_request_job.h" 36 #include "net/url_request/url_request_job.h"
37 #include "net/url_request/url_request_job_manager.h" 37 #include "net/url_request/url_request_job_manager.h"
38 #include "net/url_request/url_request_netlog_params.h" 38 #include "net/url_request/url_request_netlog_params.h"
39 #include "net/url_request/url_request_redirect_job.h" 39 #include "net/url_request/url_request_redirect_job.h"
40 #include "url/gurl.h"
41 #include "url/origin.h"
40 42
41 using base::Time; 43 using base::Time;
42 using std::string; 44 using std::string;
43 45
44 namespace net { 46 namespace net {
45 47
46 namespace { 48 namespace {
47 49
48 // Max number of http redirects to follow. Same number as gecko. 50 // Max number of http redirects to follow. Same number as gecko.
49 const int kMaxRedirects = 20; 51 const int kMaxRedirects = 20;
(...skipping 885 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 // the POST and don't have meaning in other methods. For example the 937 // the POST and don't have meaning in other methods. For example the
936 // inclusion of a multipart Content-Type header in GET can cause problems 938 // inclusion of a multipart Content-Type header in GET can cause problems
937 // with some servers: 939 // with some servers:
938 // http://code.google.com/p/chromium/issues/detail?id=843 940 // http://code.google.com/p/chromium/issues/detail?id=843
939 StripPostSpecificHeaders(&extra_request_headers_); 941 StripPostSpecificHeaders(&extra_request_headers_);
940 } 942 }
941 upload_data_stream_.reset(); 943 upload_data_stream_.reset();
942 method_ = redirect_info.new_method; 944 method_ = redirect_info.new_method;
943 } 945 }
944 946
947 // Cross-origin redirects should result in an Origin header value of "null" if
948 // the Origin header is present in the original request (see
949 // https://tools.ietf.org/id/draft-abarth-origin-03.html#rfc.section.5). This
Ryan Sleevi 2015/03/19 03:46:34 Cite the RFC :P http://tools.ietf.org/html/rfc645
jww 2015/03/19 17:53:10 Good catch. See my comment below.
950 // is necessary to prevent a reflection of POST requests to bypass CSRF
951 // protections. If the header was not set to "null", a POST request from
Ryan Sleevi 2015/03/19 03:46:34 This doesn't align with how http://tools.ietf.org/
jww 2015/03/19 17:53:09 Well, unfortunately, my description was based on t
davidben 2015/03/24 23:47:38 I believe null is correct. Looks like we ended up
jww 2015/03/27 22:16:14 Great finds! I guess I wasn't aware of Ryan's tota
952 // origin A to a malicious origin M could be redirected by M back to A. Then
953 // if A checked the Origin header, it would appear to be a request from
954 // itself, which it might reasonably conclude would allow it to modify server
955 // state. However, this would actually be a confused deputy, since M may have
956 // carefully chosen what URL on A to redirected to, such that only A should
957 // have been able to make the request.
958 //
959 // The alternate solution is to place both origins in the Origin header, but
960 // whether to do that or set Origin to "null" is left to the discretion of the
961 // user agent.
962 //
963 // See also https://crbug.com/465517.
964 if (redirect_info.new_url.GetOrigin() != url().GetOrigin() &&
965 extra_request_headers_.HasHeader(HttpRequestHeaders::kOrigin)) {
966 extra_request_headers_.SetHeader(HttpRequestHeaders::kOrigin,
967 url::Origin().string());
968 }
969
945 referrer_ = redirect_info.new_referrer; 970 referrer_ = redirect_info.new_referrer;
946 first_party_for_cookies_ = redirect_info.new_first_party_for_cookies; 971 first_party_for_cookies_ = redirect_info.new_first_party_for_cookies;
947 972
948 url_chain_.push_back(redirect_info.new_url); 973 url_chain_.push_back(redirect_info.new_url);
949 --redirect_limit_; 974 --redirect_limit_;
950 975
951 Start(); 976 Start();
952 return OK; 977 return OK;
953 } 978 }
954 979
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 new base::debug::StackTrace(NULL, 0); 1215 new base::debug::StackTrace(NULL, 0);
1191 *stack_trace_copy = stack_trace; 1216 *stack_trace_copy = stack_trace;
1192 stack_trace_.reset(stack_trace_copy); 1217 stack_trace_.reset(stack_trace_copy);
1193 } 1218 }
1194 1219
1195 const base::debug::StackTrace* URLRequest::stack_trace() const { 1220 const base::debug::StackTrace* URLRequest::stack_trace() const {
1196 return stack_trace_.get(); 1221 return stack_trace_.get();
1197 } 1222 }
1198 1223
1199 } // namespace net 1224 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698