我正在向网页添加反馈表,想知道通过“邮件”命令简单过滤 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
使用别人已经实现并调试过的库。电子邮件表单以前已经做过了,不要重新发明轮子!