我希望实现一个简单的方法来检查给定的cookie域域是否与给定的主机名匹配。
为了做到这一点,我将实现RFC 6265第5.1.3节定义的域匹配条件。
定义的第二个匹配条件是一个多部分条件,其中应用三个子条件:
下列所有条件都成立:
- 域字符串是字符串的后缀。
- 不包含在域字符串中的字符串的最后一个字符是一个%x2E (".")字符。
- 该字符串是主机名(即,不是IP地址)。
为清楚起见,当上面引用的文本指的是"字符串"时,它指的是cookie的域值,当上面引用的文本指的是"域名"时;它指的是cookie可能被发送到的主机的域名。
在这三个子条件中,第一个和第三个是相当清楚的。第二封信的措辞让我感到困惑。
我知道cookie域"example.com"只匹配"example.com"cookie域名"。example。com"匹配"& lt; anything>.example.com"。我最好的猜测是上述第二个子条件,如果指的是这个广泛的子域匹配概念,但是考虑到措辞,我不能确定。
有人能把这第二个子条件翻译成简单的技术英语吗?
在试图理解这种特殊情况时,我也遇到了很多困难。读了第十五遍后,我发现自己没有注意关键词。引用(和强调):
所以我相信下面的Python 3实现将符合RFC:
- 字符串不包含在域字符串中的最后一个字符是一个%x2E("。")字符。
import ipaddress
def domain_matches (string: str, domain_string: str) -> bool:
string = string.lower()
domain_string = domain_string.lower()
try:
ipaddress.ip_address(string)
is_host = False
except ValueError:
is_host = True
return (
string == domain_string
or
(string.endswith(domain_string)
and
string[-(len(domain_string) + 1)] == "."
and
is_host)
)
ipaddress
位是完全迂腐的。但是,对于我的用例,我省略了它。
根据RFC 6265第4.1.2.3节
例如,如果Domain属性的值是"example.com",当用户代理向example.com, www.example.com和www.corp.example.com发出HTTP请求时,将在cookie头中包含cookie。(注意,如果前面有%x2E ("."),则忽略该属性,即使该字符是不允许的,但是如果后面有%x2E ("."),则会导致用户代理忽略该属性。)
所以逻辑应该是:
1. check targetString endsWith domain
2. check lastChar(targetString) != "."
3. check targetString is host name