我希望实施一种直接的方法来检查给定的Cookie域域是否与给定的主机名匹配。
为此,我将实施section 5.1.3 of RFC 6265中定义的域匹配条件。
定义的两个匹配条件中的第二个是多部分条件,其中适用三个子条件:
满足以下所有条件:
- 域字符串是字符串的后缀。
- 字符串中未包含在字符串中的最后一个字符是%x2E("。")字符。
- 字符串是主机名(即不是IP地址)。
为清楚起见,当上面引用的文字引用"字符串"它指的是cookie的域值,当上面引用的文本引用"域名"它指的是可能向其发送cookie的主机的域名。
在这三个子条件中,第一个和第三个条件非常清楚。我发现这是第二句的措辞令人困惑。
我知道" example.com"的cookie域名。仅匹配" example.com"以及#34; .example.com"的Cookie域名匹配"< anything> .example.com"。我最好的猜测是,如果提到这个广泛的子域匹配概念,则高于第二个子条件,但是考虑到我无法确定的措辞。
是否有人能够将这第二个子条件翻译成普通的技术英语?
答案 0 :(得分:1)
例如,如果Domain属性的值为“example.com”,则在向example.com,www.example.com和www.corp发出HTTP请求时,用户代理将在Cookie标头中包含cookie。 .example.com的。 (请注意,前导%x2E(“。”)(如果存在)将被忽略,即使该字符不被允许,但尾随的%x2E(“。”)(如果存在)将导致用户代理忽略该属性。 )
所以逻辑是:
1. check targetString endsWith domain
2. check lastChar(targetString) != "."
3. check targetString is host name
答案 1 :(得分:1)
在尝试了解特定条件时,我也付出了很多努力。在阅读了15篇文章之后,我注意到我没有注意关键词。报价(并强调):
- 域字符串中字符串不包含的最后一个字符是%x2E(“。”)字符。
因此,我相信以下Python 3实现将符合RFC:
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
位应完全学究。但是,在我的用例中,我省略了它。