finnw Asked: 2009-05-31 16:52:05 +0800 CST2009-05-31 16:52:05 +0800 CST 2009-05-31 16:52:05 +0800 CST 使用来自 CGI 的 unix 'mail' 命令 - 危险吗? 772 我正在向网页添加反馈表,并想知道通过“邮件”命令简单地过滤 TEXTAREA 元素的内容(解码后)以向页面的维护者发送电子邮件是否安全。 我查看了手册页,看不到滥用它的方法,特别是只要“邮件”不在交互模式下运行,波浪号转义被禁用,“。” 单独一行不会终止消息正文。 但是我还应该注意其他危险吗? 该命令类似于: echo "$MESSAGE_BODY" | mail webmaster@mydomain.com -s 'Website feedback' email cgi unix shell 6 个回答 Voted Sekenre 2009-05-31T17:03:08+08:002009-05-31T17:03:08+08:00 是的,这很危险。邮件消息可以包含以波浪号 ~ 字符开头的行,邮件程序将其视为转义序列。这包括外壳转义和添加新收件人。(嗯,垃圾邮件!) 看看 $ man mail 看看我的意思。 Xerxes 2009-05-31T18:03:17+08:002009-05-31T18:03:17+08:00 你问这个很好 - 许多人只是想完成工作,因此在“啊……没关系”的基础上引入了一大堆漏洞。 话虽如此,我认为做你正在做的事情很好——但只要你使用过滤器——而不是你自己编写的过滤器,而是一个开源的(因此开放给公众监督)、成熟的过滤器(已经存在了一段时间)。我还要确保过滤器去除任何可能嵌套一些讨厌的 XSS 攻击的 HTML 标记和内容。 使用一个开源库,你可以在其中找到一个基本上就是我想要的。(永远不要使用任何封闭的安全应用程序——它们都注定要失败——我可以在那条评论上签名)。 amh 2009-05-31T17:02:52+08:002009-05-31T17:02:52+08:00 我会尽量避免从 CGI 调用任何命令。我确信您使用的任何语言都应该有一个库来发送电子邮件。 duffbeer703 2009-05-31T17:08:01+08:002009-05-31T17:08:01+08:00 这是一个巨大的安全漏洞。这是编写安全 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 使用其他人已经实现和调试过的库。电子邮件表格以前做过,不要重新发明轮子! cstamas 2009-06-01T01:52:13+08:002009-06-01T01:52:13+08:00 您使用哪种 CGI?大多数 cgi 语言/框架都支持发送邮件。它们总是比调用外部命令好。好吧,PHP 的 mail() 确实很糟糕,但仍然比调用外部命令更好。 从安全角度来看,建议使用 SMTP 发送邮件(例如到 localhost)。 Best Answer niXar 2009-06-01T02:11:27+08:002009-06-01T02:11:27+08:00 不要使用邮件,这是一个面向行的最终用户程序。使用大多数 MTA 中包含的“sendmail”命令(但不要使用那段被诅咒的 shblip,即 sendmail 程序)。它旨在以编程方式使用。例如,我知道 postfix 和 qmail 包含它。 cat mailmessage.txt | sendmail -ffrom@yourhost recipient@theirhost 附录:只要您知道自己在做什么,从 CGI 调用程序不一定“危险”。特别是,就像在这种情况下一样,确保您调用的程序不是为最终用户准备的,或者不是在交互模式下调用的(大多数这样的程序都允许生成一个 shell!)
是的,这很危险。邮件消息可以包含以波浪号 ~ 字符开头的行,邮件程序将其视为转义序列。这包括外壳转义和添加新收件人。(嗯,垃圾邮件!)
看看
看看我的意思。
你问这个很好 - 许多人只是想完成工作,因此在“啊……没关系”的基础上引入了一大堆漏洞。
话虽如此,我认为做你正在做的事情很好——但只要你使用过滤器——而不是你自己编写的过滤器,而是一个开源的(因此开放给公众监督)、成熟的过滤器(已经存在了一段时间)。我还要确保过滤器去除任何可能嵌套一些讨厌的 XSS 攻击的 HTML 标记和内容。
使用一个开源库,你可以在其中找到一个基本上就是我想要的。(永远不要使用任何封闭的安全应用程序——它们都注定要失败——我可以在那条评论上签名)。
我会尽量避免从 CGI 调用任何命令。我确信您使用的任何语言都应该有一个库来发送电子邮件。
这是一个巨大的安全漏洞。这是编写安全 CGI 代码的资源。
只是为了给您一个想法,以下是您需要注意的具有特殊用途的字符列表:
使用其他人已经实现和调试过的库。电子邮件表格以前做过,不要重新发明轮子!
您使用哪种 CGI?大多数 cgi 语言/框架都支持发送邮件。它们总是比调用外部命令好。好吧,PHP 的 mail() 确实很糟糕,但仍然比调用外部命令更好。
从安全角度来看,建议使用 SMTP 发送邮件(例如到 localhost)。
不要使用邮件,这是一个面向行的最终用户程序。使用大多数 MTA 中包含的“sendmail”命令(但不要使用那段被诅咒的 shblip,即 sendmail 程序)。它旨在以编程方式使用。例如,我知道 postfix 和 qmail 包含它。
附录:只要您知道自己在做什么,从 CGI 调用程序不一定“危险”。特别是,就像在这种情况下一样,确保您调用的程序不是为最终用户准备的,或者不是在交互模式下调用的(大多数这样的程序都允许生成一个 shell!)