我正在将具有一些自定义过滤器的 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 配置文件之外。