我正在给网页添加一个反馈表单,想知道通过“mail”命令简单地过滤TEXTAREA元素的内容(解码后)是否安全,以便向页面的维护者发送电子邮件。
我已经看了手册页,不能看到一种方式来滥用这个,特别是只要“邮件”不以交互模式运行,波浪转义被禁用,“。 一条线本身不会终止消息体。
但是我还有其他的危险吗?
该命令如下所示:
echo "$MESSAGE_BODY" | mail [email protected] -s 'Website feedback'
不要使用邮件,这是一个面向行的最终用户程序。 使用“sendmail”命令(但不要使用sendmail程序中被诅咒的shblip)包含在大多数MTA中。 这意味着用编程方式。 例如,我知道postfix和qmail包含它。
cat mailmessage.txt | sendmail -ffrom@yourhost recipient@theirhost
附录:只要你知道你在做什么,从CGI调用一个程序并不一定是“危险的”。 特别是,正如在这种情况下一样,请确保您所调用的程序不是针对最终用户的,也不是以交互模式调用的(大多数这样的程序将允许产生一个shell!)
是的,这是危险的。 邮件消息可以包含以波浪号〜字符开始的行,这些行被邮件程序视为转义序列。 这包括shell转义和添加新的收件人。 (mmmm,垃圾邮件!)
只要看看
$ man mail
看看我的意思。
你问这个问题真是太好了,很多人只是想完成这个工作,所以在“啊……没关系”的基础上引入了大量的漏洞。
话虽如此,我认为可以做你正在做的事 – 但只要你使用filter – 而不是你自己写的filter,而是一个开放源代码(因此公开审查),成熟(已经有一段时间了)。 我还要确保filter去掉任何可能嵌套一些恶意XSS攻击的HTML标签和内容。
使用一个开源的库,你可以find一个基本上是我所得到的。 (永远不要使用任何closures的安全应用程序 – 它们都注定要失败 – 我可以在该评论上签名)。
我尽量避免调用CGI的任何命令。 我确定你使用的任何语言都应该有一个库来发送电子邮件。
这是一个巨大的安全漏洞。 这是一个编写安全的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
使用其他人已经实施和debugging过的库。 电子邮件表格已经做完了,不要重新发明轮子!
你使用什么样的CGI? 大多数CGI语言/框架支持发送邮件。 它们总是比调用外部命令更好。 那么PHP的邮件()是非常糟糕的,但更好的是调用外部命令。
从安全angular度来看,推荐使用SMTP发送邮件(例如发送到本地主机)。