computer 版 (精华区)

发信人: Aug (如风), 信区: network
标  题: CGI的安全<转载> (4)
发信站: 听涛站 (Tue Mar 14 15:56:19 2000), 转信

1-2-1.你应该在什么地方放置你的CGI程序?

  很多服务器允许你通过各种不同途径来运行CGI程序。例如,你可以指定一个
特定的目录作为你的cgi-bin。或者,你可以允许CGI存放在任何目录下。

  这两种方法都有优缺点,但是从安全的角度来说,在一个指定的目录中放置
你的所有的CGI应用程序更好。把所有的程序放到同一个目录使你很容易跟踪
你服务器器所有的应用程序并审查它们的安全漏洞,同时,还可以防止被恶意
修改。

   如果你倾向于使用描述型的语言(例如Perl)来编写你的大部分的应用程序,
那么源码被包含在程序自身中。如果你不小心的话,这些代码很容易被阅读,
甚至被利用。例如,很多文本编辑器存储备份的文件,通常在文件名的后面加
一个扩展名(比如.bak)。

   举个例子,emacs使用扩展文件名~存储备份文件。假设你使用Perl编写了一
个CGI脚本——program.cgi——存储在Web的数据目录而非中心的指定的目录中。

现在,假设你使用emacs对程序做了一些琐碎的修改而忘记了删除备份文件。现
在,在你的目录里有了两个文件:program.cgi和program.cgi~。Web服务器知
道以.cgi结尾的文件是CGI程序,它会运行这个程序而不是显示它的内容.然而,聪
明的用户可能尝试访问program.cgi~.因为它不是以.cgi结尾,你的Web服务器将
它以原始的文本文件发送出去,这样就允许用户查看你的源代码来搜寻可能的漏
洞.这违反了避免暴露不必要信息的原则.

  当然,如果你的服务器允许你指定位于某一特定的目录下的文件均为CGI,那么
这个文件的扩展名是什么也就无关紧要了.这样,在前面的例子中,如果备份文件
放在这样特定的目录里,当用户试图访问它时,服务器就会运行这个程序而不是
发送源代码.

  注意到在你的服务器中指定一个中心目录作为CGI程序的存放位置是有限定的,
特别是在多用户系统中.例如,如果你是一个ISP(Internet Service Provider)
并且你想让你的的用户可以编写并运行他自己的CGI程序,你可能有意允许CGI程序

可以存放在任何的目录中.做这个之前,认真考虑一下可替换的选项.你的客户们打

算写很多的特定的个性化的脚本吗?如果不是,最好是让你的客户将他的CGI脚本提

交给你,然后由你将其添加到cgi-bin目录中,而不要允许CGI可在任何目录中有效.


  关于CGI程序的位置另外一个问题是将解释器放在哪里.解释脚本时,服务器运行

解释器,由它顺序装载脚本并执行.

  不要将解释器放到你的cgi-bin目录中,或其他有关你的数据结构的任何目录中.

给了用户访问解释器的权限本质上就是给了他们运行你的系统中任何程序或命令的

权力.

  如果你使用Windows或其他的非Unix操作系统,这尤其重要.在Unix系统中,你可以

在脚本的第一行中指定解释器.例如:

  #!/usr/local/bin/perl
  # this first line says use Perl to run the following script

  在Windows中,举个例子,没有类似在脚本中指定解释器的方法.一个调用Perl脚本

方法是建立一个批处理文件来调用Perl和脚本:

  rem progname.bat
  rem a wrapper for my perl script, progname.pl
  c:\perl\perl.exe progname.pl

  然而,你也许倾向于避免建立额外的程序,只是简单的将perl.exe放在你的
cgi-bin
目录中,并访问如下的URL:

  http://hostname/cgi-bin/perl.exe?progname.pl

  这也行,但是这样也允许了网络上的任何一个人运行你机器中的Perl命令.例如,
可以
访问如下的URL:

  http://hostname/cgi-bin/perl.exe?-e+unlink+%3C*.*%3E%3

  经过解码,其相当于调用Perl并运行下面的一行程序,这行程序将删除当前目录的
所有
文件.显然,这是我们不想的.

  unlink <*.*>;

  你永远没有理由将解释器放入你的cgi-bin目录中(或者其他可以运行CGI的目录
),所以
千万不要这么做.一些Windows服务器能够根据其扩展名辨别脚本的类型并运行相应
的解释
器.例如,Win-HTTPD认为每一个以.pl结尾的CGI脚本是Perl脚本,并自动运行Perl.
如果你
的Web服务器没有这个特性,就像这章第一个Windows Perl例子那样使用包装的脚本
.
More:我应该使用一个解释器吗?

  如果你使用一个Unix或者是Macintosh的Web服务器的话,记住永远不要冒险将
一个解释器放到你的cgi-bin中.前面我们提到过,Unix允许你指定特定的位置给
包含脚本的解释器.为了在Macintosh中使这些脚本有效,你可以使用一个应用程
序如ResEdit编辑代码将脚本与挪用的解释器结合.

--
※ 来源:.听涛站 cces.net.[FROM: 匿名天使的家]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:1.425毫秒