最近的 Exim 升级将此添加到默认acl_smtp_data
ACL:
.ifndef NO_CHECK_DATA_VERIFY_HEADER_SYNTAX
deny
!acl = acl_local_deny_exceptions
!verify = header_syntax
message = header syntax
log_message = header syntax ($acl_verify_message)
.endif
这会导致某些消息被拒绝。例如,垃圾邮件中的以下标头:
2020-03-02 09:22:48 1j8hHk-0000gS-3Y H=(static-181-143-69-27.une.net.co) [181.143.69.27] F=<[email protected]> rejected after DATA: header syntax (unqualified address not permitted: failing address in "From:" header is: =?utf-8?B?IkRhbmlrYSIgPERhbmlrYUB1bmUubmV0LmNvPg==?=): unqualified address not permitted: failing address in "From:" header is: =?utf-8?B?IkRhbmlrYSIgPERhbmlrYUB1bmUubmV0LmNvPg==?=
解码有问题的标头,我们得到:
00000000 22 58 69 6d 65 6e 61 22 20 3c 58 69 6d 65 6e 61 |"Ximena" <Ximena|
00000010 40 76 69 6c 2e 63 6f 6d 2e 75 61 3e |@vil.com.ua>|
0000001c
From
在我看来,这对于标题来说是一个非常好的价值。
我是否冒着使用 拒绝合法邮件的风险verify = header_syntax
,或者上面的标题是否无效并且可以安全拒绝?
深入研究 RFC 2047:
似乎 an
encoded-word
可以用于标题中地址之前的文本,但不能用于地址本身。因此使用 是安全的verify = header_syntax
,只要我们假设合法邮件不会包含违反 RFC 2047 的标头,即通过将地址偷偷带入标头的编码部分。另一方面...... RFC 6854呢?这允许标题,例如:
公平地说,RFC 还说此语法“仅用于有限使用”(“仅适用于有限或独特的情况”,例如,根据RFC 2026进行实验)。所以我不会因此而失眠!
RFC2047 被误用
第 5 节允许使用编码词的三种不同方式,这不符合任何一种方式。
编码词最多可以覆盖的是“短语”或“原子”