从 CGI 使用 unix‘mail’命令——危险吗?

从 CGI 使用 unix‘mail’命令——危险吗?

我正在向网页添加反馈表,想知道通过“邮件”命令简单过滤 TEXTAREA 元素的内容(解码后)以向页面维护者发送电子邮件是否安全。

我查看了手册页,找不到滥用此功能的方法,特别是只要“邮件”未在交互模式下运行,波浪符号转义被禁用,并且单独一行上的“。”不会终止邮件正文。

但是我还应该注意其他危险吗?

该命令类似于:

echo "$MESSAGE_BODY" | mail [email protected] -s 'Website feedback'

答案1

不要使用 mail,因为它是面向行的最终用户程序。使用大多数 MTA 中包含的“sendmail”命令(但不要使用 sendmail 程序的那个该死的 shblip)。它旨在以编程方式使用。我知道例如 postfix 和 qmail 都包含它。

cat mailmessage.txt | sendmail -ffrom@yourhost recipient@theirhost

附录:只要您知道自己在做什么,从 CGI 调用程序不一定是“危险的”。特别是,就像在这种情况下一样,确保您调用的程序不是为最终用户设计的,或者不是在交互模式下调用的(大多数此类程序都允许生成 shell!)

答案2

是的,这很危险。邮件消息可能包含以波浪符号 ~ 字符开头的行,这些行会被邮件程序视为转义序列。这包括 shell 转义和添加新收件人。(嗯,垃圾邮件!)

看看吧

$ man mail

看看我的意思。

答案3

你问这个问题很好 - 很多人只是想完成工作,因此在“啊......一切都会好起来”的基础上引入了一大堆漏洞。

话虽如此,我认为你这样做是可以的 - 但前提是你要使用过滤器 - 而且不是你自己编写的过滤器,而是开源的(因此可以接受公众监督)、成熟的(已经存在一段时间了)过滤器。我还会确保过滤器删除任何可能嵌套一些恶意 XSS 攻击的 HTML 标签和内容。

我的意思基本上是使用你可以找到的开源库。(永远不要使用任何关闭安全应用程序——它们注定会失败——我可以在该评论上签名)。

答案4

这是一个巨大的安全漏洞。这是编写安全 CGI 代码的资源。

为了给您提供一个概念,下面列出了您需要了解的一些具有特殊用途的字符:

Character Name   Character   Problems
backslash        \   quoting
double quote     "   quoting
single quote     '   quoting
dollar sign      $   variable substitution
ampersand        &   command separator
greater than     >   I/O redirection
less than        <   I/O redirection
asterisk         *   file globbing
question mark    ?   file globbing
left bracket     [   file globbing
right bracket    ]   file globbing
left paren       (   word separator
right paren      )   word separator
pipe             |   command separator
backtick         `   subcommand execution
semicolon        ;   command separator
pound sign       #   comment character (sh only)
caret            ^   command separator (sh only)
exclamation      !   history execution (csh only)
tilde            ~   username expansion (csh only)
carriage return  <ascii 13>   command separator
line feed        <ascii 10>   command separator
space            word separator
tab              ascii 9   word separator
NULL             ascii 0   truncates input

使用别人已经实现并调试过的库。电子邮件表单以前已经做过了,不要重新发明轮子!

相关内容