了解RFC6265域匹配条件



我希望实现一个简单的方法来检查给定的cookie域域是否与给定的主机名匹配。

为了做到这一点,我将实现RFC 6265第5.1.3节定义的域匹配条件。

定义的第二个匹配条件是一个多部分条件,其中应用三个子条件:

下列所有条件都成立:

  • 域字符串是字符串的后缀。
  • 不包含在域字符串中的字符串的最后一个字符是一个%x2E (".")字符。
  • 该字符串是主机名(即,不是IP地址)。

为清楚起见,当上面引用的文本指的是"字符串"时,它指的是cookie的域值,当上面引用的文本指的是"域名"时;它指的是cookie可能被发送到的主机的域名。

在这三个子条件中,第一个和第三个是相当清楚的。第二封信的措辞让我感到困惑。

我知道cookie域"example.com"只匹配"example.com"cookie域名"。example。com"匹配"& lt; anything>.example.com"。我最好的猜测是上述第二个子条件,如果指的是这个广泛的子域匹配概念,但是考虑到措辞,我不能确定。

有人能把这第二个子条件翻译成简单的技术英语吗?

在试图理解这种特殊情况时,我也遇到了很多困难。读了第十五遍后,我发现自己没有注意关键词。引用(和强调):

  • 字符串不包含在域字符串中的最后一个字符是一个%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位是完全迂腐的。但是,对于我的用例,我省略了它。

根据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

相关内容

  • 没有找到相关文章

最新更新