Skip to content

Commit e5123d8

Browse files
miss-islingtontirkarthi
authored andcommitted
bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (GH-12261)
Don't send cookies of domain A without Domain attribute to domain B when domain A is a suffix match of domain B while using a cookiejar with `http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan Singaravelan. (cherry picked from commit ca7fe50) Co-authored-by: Xtreak <tir.karthi@gmail.com>
1 parent 4e2079d commit e5123d8

File tree

3 files changed

+45
-2
lines changed

3 files changed

+45
-2
lines changed

Lib/http/cookiejar.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,11 @@ def return_ok_domain(self, cookie, request):
11451145
req_host, erhn = eff_request_host(request)
11461146
domain = cookie.domain
11471147

1148+
if domain and not domain.startswith("."):
1149+
dotdomain = "." + domain
1150+
else:
1151+
dotdomain = domain
1152+
11481153
# strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't
11491154
if (cookie.version == 0 and
11501155
(self.strict_ns_domain & self.DomainStrictNonDomain) and
@@ -1157,7 +1162,7 @@ def return_ok_domain(self, cookie, request):
11571162
_debug(" effective request-host name %s does not domain-match "
11581163
"RFC 2965 cookie domain %s", erhn, domain)
11591164
return False
1160-
if cookie.version == 0 and not ("."+erhn).endswith(domain):
1165+
if cookie.version == 0 and not ("."+erhn).endswith(dotdomain):
11611166
_debug(" request-host %s does not match Netscape cookie domain "
11621167
"%s", req_host, domain)
11631168
return False
@@ -1171,7 +1176,11 @@ def domain_return_ok(self, domain, request):
11711176
req_host = "."+req_host
11721177
if not erhn.startswith("."):
11731178
erhn = "."+erhn
1174-
if not (req_host.endswith(domain) or erhn.endswith(domain)):
1179+
if domain and not domain.startswith("."):
1180+
dotdomain = "." + domain
1181+
else:
1182+
dotdomain = domain
1183+
if not (req_host.endswith(dotdomain) or erhn.endswith(dotdomain)):
11751184
#_debug(" request domain %s does not match cookie domain %s",
11761185
# req_host, domain)
11771186
return False

Lib/test/test_http_cookiejar.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@ def test_domain_return_ok(self):
415415
("http://foo.bar.com/", ".foo.bar.com", True),
416416
("http://foo.bar.com/", "foo.bar.com", True),
417417
("http://foo.bar.com/", ".bar.com", True),
418+
("http://foo.bar.com/", "bar.com", True),
418419
("http://foo.bar.com/", "com", True),
419420
("http://foo.com/", "rhubarb.foo.com", False),
420421
("http://foo.com/", ".foo.com", True),
@@ -425,6 +426,8 @@ def test_domain_return_ok(self):
425426
("http://foo/", "foo", True),
426427
("http://foo/", "foo.local", True),
427428
("http://foo/", ".local", True),
429+
("http://barfoo.com", ".foo.com", False),
430+
("http://barfoo.com", "foo.com", False),
428431
]:
429432
request = urllib.request.Request(url)
430433
r = pol.domain_return_ok(domain, request)
@@ -959,6 +962,33 @@ def test_domain_block(self):
959962
c.add_cookie_header(req)
960963
self.assertFalse(req.has_header("Cookie"))
961964

965+
c.clear()
966+
967+
pol.set_blocked_domains([])
968+
req = urllib.request.Request("http://acme.com/")
969+
res = FakeResponse(headers, "http://acme.com/")
970+
cookies = c.make_cookies(res, req)
971+
c.extract_cookies(res, req)
972+
self.assertEqual(len(c), 1)
973+
974+
req = urllib.request.Request("http://acme.com/")
975+
c.add_cookie_header(req)
976+
self.assertTrue(req.has_header("Cookie"))
977+
978+
req = urllib.request.Request("http://badacme.com/")
979+
c.add_cookie_header(req)
980+
self.assertFalse(pol.return_ok(cookies[0], req))
981+
self.assertFalse(req.has_header("Cookie"))
982+
983+
p = pol.set_blocked_domains(["acme.com"])
984+
req = urllib.request.Request("http://acme.com/")
985+
c.add_cookie_header(req)
986+
self.assertFalse(req.has_header("Cookie"))
987+
988+
req = urllib.request.Request("http://badacme.com/")
989+
c.add_cookie_header(req)
990+
self.assertFalse(req.has_header("Cookie"))
991+
962992
def test_secure(self):
963993
for ns in True, False:
964994
for whitespace in " ", "":
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Don't send cookies of domain A without Domain attribute to domain B
2+
when domain A is a suffix match of domain B while using a cookiejar
3+
with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by
4+
Karthikeyan Singaravelan.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy