0

我正在尝试基于 SPF RFC7208 实现 check_host 函数。它几乎准备好了,剩下的就是第 7 节(https://www.rfc-editor.org/rfc/rfc7208#section-7)中详述的宏扩展。我知道有现成的解决方案,但为了示例或实践,我想实现自己的算法。这样做时,我遇到了www.example.com不符合 ABNF 描述的问题。我认为这是因为我的推理错误,这就是我寻求帮助的原因。

这是从文档中复制的 ABNF:

domain-spec      = macro-string domain-end
domain-end       = ( "." toplabel [ "." ] ) / macro-expand
toplabel         = ( *alphanum ALPHA *alphanum ) /
                  ( 1*alphanum "-" *( alphanum / "-" ) alphanum )
alphanum         = ALPHA / DIGIT
explain-string   = *( macro-string / SP )
macro-string     = *( macro-expand / macro-literal )
macro-expand     = ( "%{" macro-letter transformers *delimiter "}" )
                  / "%%" / "%_" / "%-"
macro-literal    = %x21-24 / %x26-7E
                  ; visible characters except "%"
macro-letter     = "s" / "l" / "o" / "d" / "i" / "p" / "h" /
                  "c" / "r" / "t" / "v"
transformers     = *DIGIT [ "r" ]
delimiter        = "." / "-" / "+" / "," / "/" / "_" / "="

我认为将 domain-spec 应用于www.example.com将遵循以下路径: domain-spec -> macro-string -> macro-literal (repeated) 这将耗尽整个字符串,然后 domain-end 将永远不会匹配.

我哪里错了?

编辑1:

我想我得到了答案,原来的问题更像是一个确认请求。ABNF 中的重复是贪婪的,但可能允许后退 - 即如果这会导致匹配,请少吃。查看 RFC5234 ( https://www.rfc-editor.org/rfc/rfc5234 ),虽然不是全部,但我无法确定地发现这一点。任何人都可以确认吗?

4

0 回答 0