如何设置 Procmail 来从电子邮件主题运行脚本

如何设置 Procmail 来从电子邮件主题运行脚本

我正在建立一个网站,让用户填写表格,然后向服务器发送电子邮件。电子邮件的主题是作为服务器脚本生成的,我想在服务器命令行上运行该脚本,以便自动执行流程。我目前正在手动运行这些命令,方法是复制格式化的主题并在终端中运行它。有人能给我指明正确的方向吗?我读过几篇关于 Procmail 的帖子,但仍然不清楚它们如何适用于我当前的需求。

以下是我想要设置的内容。交易电子邮件的主题看起来类似于“cloudron clone --app store --backup latest —location site”。服务器只是按原样获取主题并将其作为脚本运行。服务器设置为执行此类脚本。我希望这更清楚。

答案1

如果主题标头包含您要运行的命令,那么如果有人能够了解或猜出您的电子邮件是什么样子,那么您将面临任意代码执行漏洞。但像这样:

:0
* ^From www@your\.server\.example\.net
* ^X-Secret-Header: pA$$w0rd!\?
| formail -czxSubject: | sh

为了防范这种情况,您可以设置的条件越多、越具体,被利用的风险就越小。我仍然会非常犹豫是否将其放在生产服务器上。如果您可以设置一个条件,只允许少数非常具体的命令(不rm、不cat、不ls、不cp、不shsusudo显然),那么嗯也许。

以下是仅允许一个特定命令的变体:

:0
* ^Subject: adduser \/[a-z0-9_]+
| sqlite3 -d users -u db -e "insert into table users (name) with value ($MATCH)"

(我的 SQL 语法可能有点奇怪;抱歉。)

以下是更新后的问题中的示例:

:0
* ^Subject: \/cloudron clone --app store --backup latest —location [a-z0-9]+
| $MATCH </dev/null

...或者从安全角度来看更好的做法是只允许指定参数:

:0
* ^Subject: cloudron clone \/[a-z0-9]+
| cloudron clone --app store --backup latest --location "$MATCH" </dev/null

这些示例演示了如何MATCH使用特殊的正则表达式运算符捕获某些\/内容,我们相当异想天开地将传入的消息通过管道传输到命令中,该命令将忽略其标准输入(我们基本上是为了副作用而运行它)。这将顺便导致 Procmail 认为该消息已送达;添加一个c标志以避免这种情况(:0c)。

许多 Procmail 示例允许在Subject:冒号等之后出现任意空格,但由于这些消息可能是机器生成的,所以在这里这是一个不必要的复杂化。

这不能正确处理MIME RFC2047 编码的标头;如果您需要这样做,则需要添加解码步骤(Perl 单行代码?)

相关内容