了解RFC6265域匹配条件

时间:2014-03-13 18:32:56

标签: cookies domain-name rfc6265

我希望实施一种直接的方法来检查给定的Cookie域域是否与给定的主机名匹配。

为此,我将实施section 5.1.3 of RFC 6265中定义的域匹配条件。

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

  

满足以下所有条件:

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

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

在这三个子条件中,第一个和第三个条件非常清楚。我发现这是第二句的措辞令人困惑。

我知道" example.com"的cookie域名。仅匹配" example.com"以及#34; .example.com"的Cookie域名匹配"< anything> .example.com"。我最好的猜测是,如果提到这个广泛的子域匹配概念,则高于第二个子条件,但是考虑到我无法确定的措辞。

是否有人能够将这第二个子条件翻译成普通的技术英语?

2 个答案:

答案 0 :(得分:1)

根据section 4.1.2.3 of RFC 6265

  

例如,如果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位应完全学究。但是,在我的用例中,我省略了它。