Skip to content

Commit ca7fe50

Browse files
tirkarthined-deily
authored andcommitted
bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258)
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.
1 parent 738c19f commit ca7fe50

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
@@ -1148,6 +1148,11 @@ def return_ok_domain(self, cookie, request):
11481148
req_host, erhn = eff_request_host(request)
11491149
domain = cookie.domain
11501150

1151+
if domain and not domain.startswith("."):
1152+
dotdomain = "." + domain
1153+
else:
1154+
dotdomain = domain
1155+
11511156
# strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't
11521157
if (cookie.version == 0 and
11531158
(self.strict_ns_domain & self.DomainStrictNonDomain) and
@@ -1160,7 +1165,7 @@ def return_ok_domain(self, cookie, request):
11601165
_debug(" effective request-host name %s does not domain-match "
11611166
"RFC 2965 cookie domain %s", erhn, domain)
11621167
return False
1163-
if cookie.version == 0 and not ("."+erhn).endswith(domain):
1168+
if cookie.version == 0 and not ("."+erhn).endswith(dotdomain):
11641169
_debug(" request-host %s does not match Netscape cookie domain "
11651170
"%s", req_host, domain)
11661171
return False
@@ -1174,7 +1179,11 @@ def domain_return_ok(self, domain, request):
11741179
req_host = "."+req_host
11751180
if not erhn.startswith("."):
11761181
erhn = "."+erhn
1177-
if not (req_host.endswith(domain) or erhn.endswith(domain)):
1182+
if domain and not domain.startswith("."):
1183+
dotdomain = "." + domain
1184+
else:
1185+
dotdomain = domain
1186+
if not (req_host.endswith(dotdomain) or erhn.endswith(dotdomain)):
11781187
#_debug(" request domain %s does not match cookie domain %s",
11791188
# req_host, domain)
11801189
return False

Lib/test/test_http_cookiejar.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ def test_domain_return_ok(self):
440440
("http://foo.bar.com/", ".foo.bar.com", True),
441441
("http://foo.bar.com/", "foo.bar.com", True),
442442
("http://foo.bar.com/", ".bar.com", True),
443+
("http://foo.bar.com/", "bar.com", True),
443444
("http://foo.bar.com/", "com", True),
444445
("http://foo.com/", "rhubarb.foo.com", False),
445446
("http://foo.com/", ".foo.com", True),
@@ -450,6 +451,8 @@ def test_domain_return_ok(self):
450451
("http://foo/", "foo", True),
451452
("http://foo/", "foo.local", True),
452453
("http://foo/", ".local", True),
454+
("http://barfoo.com", ".foo.com", False),
455+
("http://barfoo.com", "foo.com", False),
453456
]:
454457
request = urllib.request.Request(url)
455458
r = pol.domain_return_ok(domain, request)
@@ -984,6 +987,33 @@ def test_domain_block(self):
984987
c.add_cookie_header(req)
985988
self.assertFalse(req.has_header("Cookie"))
986989

990+
c.clear()
991+
992+
pol.set_blocked_domains([])
993+
req = urllib.request.Request("http://acme.com/")
994+
res = FakeResponse(headers, "http://acme.com/")
995+
cookies = c.make_cookies(res, req)
996+
c.extract_cookies(res, req)
997+
self.assertEqual(len(c), 1)
998+
999+
req = urllib.request.Request("http://acme.com/")
1000+
c.add_cookie_header(req)
1001+
self.assertTrue(req.has_header("Cookie"))
1002+
1003+
req = urllib.request.Request("http://badacme.com/")
1004+
c.add_cookie_header(req)
1005+
self.assertFalse(pol.return_ok(cookies[0], req))
1006+
self.assertFalse(req.has_header("Cookie"))
1007+
1008+
p = pol.set_blocked_domains(["acme.com"])
1009+
req = urllib.request.Request("http://acme.com/")
1010+
c.add_cookie_header(req)
1011+
self.assertFalse(req.has_header("Cookie"))
1012+
1013+
req = urllib.request.Request("http://badacme.com/")
1014+
c.add_cookie_header(req)
1015+
self.assertFalse(req.has_header("Cookie"))
1016+
9871017
def test_secure(self):
9881018
for ns in True, False:
9891019
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