我正在将具有一些自定义过滤器的 exim4 安装升级到 Debian 11。(具体来说,过滤器是这个。)
由于它使用了 Exim 4.94,我现在遇到了新的“污染变量”功能,它破坏了我的过滤器。在调试模式下检查 Exim 时exim4 -bdf -d+filter
出现错误是指受污染的文件名(为便于阅读而添加了一些换行符):
102536 LOG: MAIN PANIC
102536 Tainted filename for search '/var/spool/exim4/db/disposable-aliases.db'
102536 Filter error: failed to expand
"${lookup sqlite{/var/spool/exim4/db/disposable-aliases.db \
select default_remaining from stem_configs \
where stem = '${quote_sqlite:$local_part}'} {$value}{0}}"
in add command: NULL
102536 Filter: end of processing
在这种情况下,对文件名的引用似乎是虚假的,因为首先文件名是硬连线的(所以不能被污染?)其次,如果我用'${quote_sqlite:$local_part}'
文字值替换查询的一部分,错误就会停止(至少来自这个特定的查找)。
因此,我怀疑问题实际上是$local_part
查询中存在的问题,而不是文件名。
我发现$local_part
在某些情况下有一个未受污染的版本可用,$local_part_data
但是在我的情况下,它没有被设置,因此没有用。
更多搜索可在此处的 Exim4 文档中找到此断言:
如果查询中使用了受污染的数据,则应使用适合查找的 ${quote_:} 扩展运算符将其引用 [原文如此]。
这似乎暗示着${sqlite_quote: .. }
扩展应该对$local_data
. 这似乎是明智的,但这实际上是否正确,因为如果我用文字替换扩展,污染问题就会停止?
如果${sqlite_quote: .. }
真的是去污点它的结果,那么是什么导致这个查找被拒绝?
如果不是,那我还有什么办法?上面的 sqlite 查找实际上旨在根据存储在数据库中的有效值列表验证本地部分,并且应该能够去除该值!
我应该补充一点:我不能使用文件查找,因为这个有效的列表需要动态配置,在 exim4 配置文件之外。
${quote_
...不要进行去污。并且 exim 污染在整个字符串上,所以
在
'${quote_sqlite:$local_part}'
仍然受到污染,并且污染扩散到文件名,破坏了查找。exim 规范说您可以将文件名放在单词“sqlite”之后(在包含查询的大括号之外)
exim 规范 9.26 - 关于 sqlite 的更多信息
您当前使用的方法已被弃用,因此不再记录。
只是为了添加到@Jasen 的答案(使用新的 sqlite 查找语法,问题就消失了),根据使用的 Exim 版本,有一些皱纹:
sqlite_dbfile
实现了全局设置,但不支持file=
查找选项。所以没有办法使用较新的语法并拥有多个 sqlite 数据库。(这是我目前在 Debian 11 中使用 4.94.2 的经验,在这里特别提到,请检查源代码历史)file=
选项(同上;提交在这里)。file=
选项,Exim 4.94 的错误也会产生误导:它显示“sqlite”查找所需的绝对文件名”,即使文件名是未受污染的和绝对的。(大部分来自这里的线程讨论)