敬业的IT人 >> 网站建设 >> Web编程 >> CGI/Perl >> CGI教学:CGI安全问题(七)

CGI教学:CGI安全问题(七)

敬业的IT人 互联网 佚名 2008-4-15 9:09:42
3 内部伤害

到目前为止,仅仅考虑了通过Web例览站点的人——从几千里之外——可能带来的潜在的安全危险。但实际上还存在另一种离得更近的危险因素。

在cgi(现在已经不多人在用了)安全问题上常犯的一种错误是忘记了本地用户。尽管通过Web浏览站点的人不影响本地安全,如文件保护和所有者,但Web服务器的本地用户却能这样,必须做出更多努力防止这些入侵。大部分多用户系统上,如UNIX,Web服务器是作为一个程序运行的,而机器仍被许多人使用做着许多事情。仅仅因为为某人与自己一起工作或访问自己的学并不意味着他能抵制住诱惑,而不去捣鼓Web安装从而引起问题。

3.1 cgi(现在已经不多人在用了)脚本用户

大部分Web服务器是作为运行cgi(现在已经不多人在用了)脚本的特殊用户而安装的。这是在cgi(现在已经不多人在用了)程序运行时拥有该cgi(现在已经不多人在用了)程序的用户,并且他所拥有的权限能限制该脚本能做什么事情。

在UNIX下,服务器自己也是作为root(系统的超级用户或管理员)运行的,并允许它使用端口80作为浏览器与之通信的地方(只有root能使用这些被称为"保留的"端口0到1023;所有用户都可以使用其余的端口)。当服务器执行cgi(现在已经不多人在用了)程序时,大部分Web服务器都能设置为以另外一个用户而不是Web服务器本身来运行该程序——尽管不是所有服务器都能这么做。

将cgi(现在已经不多人在用了)脚本作为root运行是很危险的!服务器应被设为利用一个普通用户,如常用的nobody来运行cgi(现在已经不多人在用了)脚本。用户权限越小,运行的cgi(现在已经不多人在用了)脚本能造成的危害就越小。

3.2 Setuid 危险

编程者还应知道自己的UNIX cgi(现在已经不多人在用了)脚本中是否设置Setuid位。如果对某个可执行文件允许该选项,将能使该程序与拥有该文件的用户有同样权限,而不是执行它的用户。如果自己的cgi(现在已经不多人在用了)脚本上设置setuid位,无论服务器作为什么用户来运行它,它的权限都等同于该文件的拥有者。这当然有很大的隐患--可能会对以其权限运行脚本的用户失去控制。幸运的是Setuid位很容易被禁止。对所有cgi(现在已经不多人在用了)脚本执行chmod a-s即能关闭所有的setuid,程序即能以允许的权限运行。

当然,在某些情况下也许希望设置setuid位--例如如果脚本需要以特殊用户身份来运行以访问一个数据库。在这种情况下,必须加倍小心确保该程序的其他文件保护能将可以访问它的用户限制在允许范围内。

3.3 "Community" Web服务器

即使Web服务器以一个常用的用户来执行脚本,仍有一个潜在的问题,那就是一个人并不总是能控制服务器。如果许多人共同控制服务器,每个人都可以将cgi(现在已经不多人在用了)脚本安装作为nobody用户来运行。这就使这些人的任何一个都可以利用cgi(现在已经不多人在用了)程序访问他们原先不能访问的地方,而这些地方是nobody允许进入的。

也许潜在的安全问题的解决办法是将cgi(现在已经不多人在用了)的控制限制为一个人。在某些情况下尽管这似乎是合理的,但对较大站点却经常不太可能。例如,一个大学有几百个学生,每个学生都想试着去编写并安装cgi(现在已经不多人在用了)脚本。

3.4 使用cgi(现在已经不多人在用了) Wrap

当有多个用户可以访问cgi(现在已经不多人在用了)时,对于确定脚本以什么用户运行的问题的一个较好的解决办法是cgi(现在已经不多人在用了) wrap程序。cgi(现在已经不多人在用了) Wrap,可以在using cgi(现在已经不多人在用了) Web站点中找到,是一个简单的包装,它以拥有该文件的用户而不是服务器指定的用户来运行cgi(现在已经不多人在用了)脚本。这种简单的预防措施使脚本拥有者对它可能的危害负责。

因为cgi(现在已经不多人在用了) wrap使得cgi(现在已经不多人在用了)脚本的作者负责他们自己的脚本权限,所以它不仅是一个保护其他人拥有的重要文件的有力的工具,而且是促使人们编写安全的脚本的有力的工具。只有他们自己的文件会处于危险之中,这样的现实对脚本作者会是极大的促进。

3.5 cgi(现在已经不多人在用了)脚本权限

还应该清楚了解cgi(现在已经不多人在用了)脚本被哪个用户拥有以及脚本自身的文件权限。包含脚本的目录的权限也非常重要。

例如,如果Web服务器上的cgi(现在已经不多人在用了)-bin目录是所有人可写的,那任何本地用户将能删除cgi(现在已经不多人在用了)脚本并用另一个来代替。如果脚本本身是所有人可写的话,那么任何人将能修改脚本完成任何事情。

请看下面这段无害的UNIX cgi(现在已经不多人在用了)脚本:

#!/bin/sh
#Se
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com