CGI的安全(一)More:选择一个安全的Web服务器 在不同的平台有数不清的Web服务器可供使用。如果可能的话,自我确定一个产品是否安全是很困难的,你将不得不依靠公司的信誉和口头承诺。 检查你的选择。在你拥有了一个Web服务器的列表之后,看一下每个产品的有效期以及目前有多少人使用它。越老的并且经常使用的Web服务器,有关的安全方面的bug越有可能被发现并修补。如果源码是开放的,并且你有时间和专门技术,自己从头至尾看一下源文件,看看能否找到潜在的漏洞。阅读网络中不同的新闻组对该产品以及作者和发行人的评论。著名的公司或作者会很快的通知用户其产品的任何问题。阅读各个组织(如CIAC(Computer Incident AdvisoryCapability)和CERT)有关安全方面的警告信息。 检查所有的服务器组件并确定你是否真的需要所有组件的特性。越复杂、功能越强大的服务器,越有可能存在未被发现的安全问题。确定你的服务器支持日志功能,这样你可以跟踪安全问题或其它故障的原因。 有一个对付意外事件的计划。如果发现安全漏洞,要随时准备升级或者替换你的Web服务器。关注新版本的发行和新闻组中有关你的Web服务器的信息。尽量使用Web服务器最新的非测试的版本。 不必担心免费的服务器。关于开发源码使服务器更安全或者相反有争论。如果服务器的源码不公开,安全漏洞将更难发现。如果源码公开,那么,理论上,漏洞将很快被发现,公开并得到修补。 在增强服务器的安全性时,应该有三个目的: A.配置你的程序使它只能提供你指定的服务。 B.不到必要的时候不暴露任何信息。 C.如果系统遭到入侵,最大限度地减少损坏。 我知道的有关你的计算机的信息越多,我就越有机会闯入你的计算机。例如,如果我知道哪个目录或者文件夹存储了你的所有的敏感的、私有的信息,这样,我将进入你的系统获取全部访问权缩小至只是获得某个目录的权限(通常是更容易了)。或者,如果我可以访问你的服务器配置文件或源码或者是你的CGI脚本,那我可以很容易的浏览它们来寻找安全漏洞。如果你的系统有漏洞,你不想让别人轻易知道,你必须在别人之前发现它们。 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 |
推荐文章
精彩文章
|