Sun Java System Application Server 7 Web应用开发者指南

上一部分 | 目录


使用CGI

通用网关接口(CGI)程序运行在服务器上并为客户端请求返回一个响应。可以使用多种语言编写CGI程序,包括CC++Perlshell脚本。通过URL可以调用CGI程序。

现在有大量关于编写CGI程序的资料。刚开始学习的时候,可以参看"The Common Gateway Interface" (通用网关接口),网址如下:

http://hoohoo.ncsa.uiuc.edu/cgi/overview.html

Sun Java System Application Server遵循了1.1版本的CGI规范。

每次运行CGI脚本或程序时,服务器都会启动一个进程,这是一种开销很大的服务器编程方法。

考虑到安全性,CGI脚本基于服务器的安全配置。如果想获得更多信息,请参考"SHTML和CGI的安全性" Sun ONE Application Server管理员安全指南。

这部分包含下列主题:

CGIJ2EE Web 应用


Sun Java System Application Server中,CGI 程序不能和J2EE web应用互操作,特别是:

  • 不要将CGI程序放在web应用上下文根目录中。
  • 不要在servlet或JSP中包含CGI程序的输出结果。
  • 不要将servlet或JSP的请求发送给CGI程序。
  • 不能将J2EE security-constraint和filter-mapping的性能应用到CGI程序中。

启动CGI


Sun Java System Application Server提供了下面这些方法来识别CGI程序:

指定CGI目录

指定包含CGI程序的目录(并且仅包含CGI程序)

1. 在计算机上创建CGI目录。该目录不一定要是文档根目录下的子目录。这就是为什么在步骤7中必须指定URL前缀。

2.在Administration界面的服务器实例下打开HTTP服务器组件。

3.进入虚拟服务器页。

4.点击要指定的CGI目录所在的虚拟服务器的名字。

5.点击CGI标签。

6.点击CGI目录选项。

7.在URL前缀域中,输入该目录使用的URL前缀。也就是,输入的文本是URL中的CGI程序的目录。

例如,如果输入cgi-bin 作为URL前缀,那么,所有到这些CGI程序的URL都有相同的结构,如下所示:

http://yourserver.domain.com/cgi-bin/program-name


注意

指定的URL前缀可以和前面步骤中指定的真实的CGI目录不同。


8.在CGI目录文本域中,输入目录位置的绝对路径。

9.点击OK按钮。

10.进入服务器实例页,并且点击Apply Changes(应用改变)按钮。

服务器将这些目录中的所有文件视为CGI程序。

要删除已有的CGI目录,可以在CGI目录页中点击目录的删除(Remove)按钮。点击目录的编辑(Edit)按钮可以改变URL前缀或现有目录的CGI目录。

CGI程序复制到指定的目录下。记住,这些目录下的任何文件都是作为CGI文件处理的,所以,不要将HTML文件放在CGI目录下。

对于每个CGI目录,文件obj.conf 包含一个 NameTrans 指令,该指令将名字cgi 和每个对该目录中的资源的请求关联起来。在Administration界面中指定CGI目录时,这些指令会自动添加到obj.conf 中,如果你乐意的话,也可以手动将它们添加到obj.conf 中。

例如,下面的指令将所有对http://server-name/cgi-local 中的资源的请求解释成是调用目录C:/SunServer/docs/mycgi 下的程序的请求。

NameTrans fn="pfx2dir" from="/cgi-local" dir="C:/SunServer/docs/mycgi" name="cgi"

obj.conf 文件必须包含下列命名对象。


<Object name="cgi">
ObjectType fn="force-type" type="magnus-internal/cgi"
Service fn="send-cgi"
</Object>


不要删除obj.conf中的这个对象。如果删除了这个对象,那么不管在Administration界面中指定还是手动将NameTrans命令添加到obj.conf中,服务器都不能识别CGI目录。

指定CGI文件扩展名

为了让服务器将所有具有特定扩展名的文件视为CGI程序,而不管这些文件处于哪个目录中,你可以:

1. Administration界面的服务器实例下打开HTTP服务器组件。

2. 进入虚拟服务器页。

3. 点击要指定的CGI文件类型所在的虚拟服务器的名字。

4. 点击CGI标签。

5. 点击CGI文件类型选项。

6. 从编辑检出器中选择想要应用该变化的资源。

7. 点击激活状态下的CGI中的Yes单选按钮作为文件类型。

8. 点击OK 按钮。

9. 进入服务器实例页,选择应用改变(Apply Changes)按钮。

默认的CGI扩展名是.cgi.bat .exe

要改变用于表示CGI程序的某个扩展名,可以通过修改mime.types 中如下所示的一行来指定希望使用的扩展名。记住,编辑mime.types后一定要重新启动服务器。

type=magnus-internal/cgi exts=cgi,exe,bat

当服务器能将带有合适扩展名的所有文件视为CGI程序时,obj.conf 文件包含下列服务指令:

Service fn="send-cgi" type="magnus-internal/cgi"

创建CGI程序的常规执行环境(仅针对UNIX)


在创建常规执行环境之前,必须安装suid Cgistub 并将之作为root来运行:

1. 以超级用户身份登录。

su

2. Cgistub创建private 目录:

cd instance_dir

mkdir private

3. Cgistub 复制到private 目录中:

cd private

cp install_dir/lib/Cgistub .

4. private 的所有者设置成服务器用户。

chown username .

5. 设置private的权限。

chmod 500 .

6. Cgistub 的所有者设置成root

chown root Cgistub

7. 设置Cgistub的权限:

chmod 4711 Cgistub

8. 可以给每个对obj.conf 中的send-cgi 函数的引用赋一个user 参数。例如:

Service fn="send-cgi" user="username"

可以使用变量替代。例如,在server.xml中,给virtual-server 元素下面的property 子元素。

<property name="user" value="username"/>

这样,可以按如下方式编写obj.conf 中的send-cgi 函数行:

Service fn="send-cgi" user="$user"

如果想获得关于send-cgiobj.conf的更多信息,请参考Sun Java System Application Server开发者NSAPI指南。如果想获得关于server.xml的更多信息,请参考Sun Java System Application Server管理员配置文件参考。

9. 重新启动服务器,使这些改变生效。


注意

推荐将Cgistub 安装在instance_dir/private 目录下。如果将它安装在其它地方,必须在init.conf 中的init-cgi 函数内将路径指定到Cgistub。如果想获得更详细的信息,请参考Sun Java System 应用服务器开发者NSAPI指南。



注意

可能不能将suid Cgistub程序安装在NFS装配台中。如果想使用suid Cgistub必须将服务器实例安装在本地文件系统中。


Cgistub 加强了下列安全约束:

  • 执行CGI程序的用户的uid必须大于等于100。这就能禁止某些人通过使用 Cgistub 获得root权限。
  • CGI程序的所有者必须有执行权限,并且除了它的所有者之外,任何其他用户都没有对它的写权限。这样要在其中插入代码并远程执行程序就很困难了。
  • Cgistub通过权限0700创建它的UNIX listen socket侦听套接字)。

注意

一些UNIX变种,包括SunOS/Solaris的当前版本,没有指定Socket权限。为了避免恶意的用户利用Cgistub,将服务器的临时目录(使用init.conf TempDir 指令)变成只允许服务器用户访问的目录。如果想获得更详细的信息,请参考Sun Java System 应用服务器管理员配置文件参考。


安装了Cgistub可以按下列方法创建常规执行环境

指定虚拟服务器的唯一的CGI目录、UNIX用户和组

为了避免虚拟服务器的CGI程序干扰其它用户,必须将这些程序存储在唯一的一个目录中,并且只有在具有唯一UNIX 用户和组的权限时才可以执行。

首先,创建UNIX用户和组。各个操作系统中创建用户和组各有不同的步骤。可以参考操作系统文档。

然后,按下列步骤创建虚拟服务器的cgi-bin 目录。

1. 以超级用户身份登录。

su

2. 进入虚拟服务器目录。

cd vs_dir

3. 创建cgi-bin 目录。

mkdir cgi-bin

chown user:group cgi-bin

chmod 755 cgi-bin

通过下列方法中的一种可以设置虚拟服务器的CGI目录、用户和组:

  • 使用obj.conf文件中send-cgi函数的dir, user和group参数。如果想获得更多信息,请参考Sun Java System 开发者NSAPI指南。
  • 在Administration界面中输入信息:
    a.在服务器实例中打开服务器组件。
    b.进入虚拟服务器页。
    c.点击要指定的CGI目录所在的虚拟服务器的名字。
    d.点击一般(General)标签。
    e.在Directory、User和Group域中输入值。
    f.点击保存(Save)按钮。
    g.进入服务器实例页,并选择应用改变(Apply Changes)按钮。

如果想获得更多信息,请参考Sun Java System 应用服务器管理指南。

指定虚拟服务器的Chroot目录

为了进一步提高安全性,必须防止这些CGI脚本访问虚拟服务器目录之上或之外的数据。

首先,设置chroot环境。各个操作系统中建立chroot各有不同的步骤。可以查看操作系统文档。 ftpd chroot man 页是很好的参考文档。

下面是Solaris 版本2.68需要的步骤:

1. 以超级用户身份登录。

su

2. 进入chroot目录。这是前一节提到的vs_dir 目录。

cd chroot

3. chroot目录中创建tmp

mkdir tmp

chmod 1777 tmp

4. chroot目录中创建dev

mkdir dev

chmod 755 dev

5. 显示/dev/tcp,并且注意输出结果中的主设备号和次设备号。在该例中, 11是主设备号,42是次设备号。

ls -lL /dev/tcp

crw-rw-rw- 1 root sys 11, 42 Apr 9 1998 /dev/tcp

6. 使用主设备号和次设备号创建tcp 设备。

mknod dev/tcp c 11 42

chmod 666 dev/tcp

7. 为下面每个设备重复步骤5和步骤6 (每个设备有不同的主设备号和次设备号)

/dev/udp
/dev/ip
/dev/kmem
/dev/kstat
/dev/ksyms
/dev/mem
/dev/null
/dev/stderr
/dev/stdin
/dev/stdout
/dev/ticotsord
/dev/zero

8. 设置chroot目录中的dev的设备权限。

chmod 666 dev/*

9. 创建并显示chroot目录中的lib usr/lib

mkdir usr

mkdir usr/lib

ln -s /usr/lib

ln /usr/lib/* usr/lib

可以忽略该命令产生的消息。

如果/usr/lib 目录存在于不同的文件系统上,使用下面命令替换最后一条命令。

cp -rf /usr/lib/* usr/lib

10.   创建并显示chroot目录中的bin usr/bin

mkdir usr/bin

ln -s /usr/bin

ln /usr/bin/* usr/bin

可以忽略该命令产生的消息。

如果 /usr/bin 目录存在不同的文件系统上,使用下面命令替换最后一条命令。

cp -rf /usr/bin/* usr/bin

11.   创建并显示chroot目录中的etc

mkdir etc

ln /etc/passwd /etc/group /etc/netconfig etc

12.   测试chroot环境。

chroot chroot bin/ls -l

输出结果应该如下:

   total 14
   lrwxrwxrwx            1 root         other         8 Jan 13 03:32 bin -> /usr/bin
   drwxr-xr-x            2 user         group         512 Jan 13 03:42 cgi-bin
   drwxr-xr-x            2 root         other         512 Jan 13 03:28 dev
   drwxr-xr-x            2 user         group         512 Jan 13 03:26 docs
   drwxr-xr-x            2 root         other         512 Jan 13 03:33 etc
   lrwxrwxrwx            1 root         other         8 Jan 13 03:30 lib -> /usr/lib
   drwxr-xr-x            4 root         other         512 Jan 13 03:32 usr

可以使用下列方法中的一种来设置虚拟服务器的chroot目录:

  • 使用obj.conf 文件中send-cgi 函数的chroot 参数。如果想获得更多信息,请参考Sun Java System 应用服务器开发者NSAPI指南。
  • 使用Administration界面输入这些信息:
    a.     在服务器实例下打开HTTP服务器组件。
    b.     进入虚拟服务器页。
    c.     点击要指定的CGI 目录所在的虚拟服务器的名字。
    d.     点击一般(General)标签。
    e.     Chroot域中输入值。
    f.       点击保存(Save)按钮。
    g.     进入服务器实例页并且选择应用改变(Apply Changes)按钮。

如果想获得更多信息,请参考Sun Java System Application Server的管理员指南。

在服务器上添加CGI程序


Sun Java System Application Server上添加CGI程序,只需要完成下面的步骤之一:

  •   删除CGI目录中的程序文件(如果存在的话)
  • 将程序名命名为服务器能识别的CGI程序名, 并且将它放入文档根目录或根目录下的任何目录中(在激活了CGI文件类型识别的情况下。

对于UNIX,应确保程序文件进行权限设置。

设置CGI程序的优先权


要设置CGI程序的优先权,可以:

1. 在服务器实例下打开HTTP服务器组件。

2. 进入虚拟服务器页。

3. 点击要指定的CGI 目录所在的虚拟服务器的名字。

4. 点击一般(General)标签。

5. Nice域中输入一个值。该增量决定了服务器中该CGI程序的优先权。典型的情况是,服务器运行时nice的值是0,并且nice增量的值是0 (CGI程序和服务器具有相同的优先权) 19 (CGI程序的优先权比服务器要低得多)。通过将优先级指定为-1可以将CGI程序的优先级设置得比服务器高,但是并不推荐这样做。

6. 点击保存(Save)按钮。

7. 进入服务器实例页,并且选择应用改变(Apply Changes)按钮。

如果想获得更多信息,请参考Sun Java System Application Server的管理员指南。

Windows CGI 程序


本节讨论如何安装Windows CGI 程序,包含下列主题:

Windows CGI 程序概述

Windows CGI程序的处理类似于其它CGI程序。指定一个目录,在该目录中仅包含Windows CGI程序,或指定所有的Windows CGI程序有相同的文件扩展名,或两样都指定。

虽然Windows CGI程序的行为类似于常规CGI程序,但是服务器在实际执行这两类程序的时候稍微有些不同。因此,需要为Windows CGI程序指定不同的目录。如果能够使用Windows CGI文件类型,就使用文件扩展名.wcg

Sun Java System Application Servers支持Windows CGI 1.3a 非正式规范,具有下列区别:

  • 为了支持安全方法,在[CGI]节中添加了下列关键字:
    •       HTTPS:它的值是on off,取决于是否由SSL来指导事务。
    • HTTPS Keysize:如果HTTPSon,该值就是会话关键字中用来加密的字节数。
    • HTTPS Secret Keysize:如果HTTPSon,该值就是用来产生服务器的私钥的字节数。
  • [CGI]中的关键字Document Root 可能并不指向期望的文档根,因为服务器不是只有单个文档根。该变量返回的目录是Windows CGI程序的根目录。
  • 不支[CGI]中的关键字Server Admin
  • 不支持[CGI]节中的关键字Authentication Realm
  • 不支持带有多部分/表单数据编码的表单的发送。

指定Windows CGI 目录

要指定包含WinCGI程序(并仅包含WinCGI程序)的目录,可以:

1. 在计算机上创建Windows CGI目录。该目录不一定要是文档根目录的子目录。所以在步骤7中必须指定URL前缀。

2. Administration界面的服务器实例下打开HTTP服务器组件。

3. 进入虚拟服务器页。

4. 点击要指定的Windows CGI 目录所在的虚拟服务器的名字。

5. 点击CGI标签。

6. 点击WinCGI目录选项。

7. URL前缀域中,输入该目录要使用的URL前缀。也就是,输入的文本是URL中的CGI程序的目录。

例如,如果输入cgi-bin 作为URL前缀,那么,所有指向这些CGI程序的URL都有相同的结构,如下所示:

http://yourserver.domain.com/cgi-bin/program-name


注意

指定的URL前缀可以和前面几步中指定的真实的CGI目录不同。


8. WINCGI目录文本域中,输入目录的绝对路径。

9. 允许脚本跟踪,选择Yes单选按钮。

10.   点击OK 按钮。

11.   进入服务器实例页,并且点击应用改变(Apply Change)按钮。

点击WINCGI目录页的目录的删除(Remove)按钮,可以删除已有的W indows CGI目录。点击目录的编辑(Edit)按钮可以改变URL前缀或现有目录的CGI目录。

W indows CGI程序复制到指定的目录下。记住,这些目录下的任何文件都是作为Windows CGI文件处理的。

指定Windows CGI文件类型

为了指定Windows CGI文件的扩展名,执行下列步骤:

1. 在服务器实例下打开HTTP服务器组件。

2. 进入虚拟服务器页。

3. 点击要指定的Windows CGI 目录所在的虚拟服务器的名字。

4. 注意虚拟服务器的MIME 类型文件名。

5. 进入MIME Type Files页。

6. 点击与步骤4中提出的名字相匹配的名字。

7. 点击MIME File... 按钮。

8. 添加一个具有下列设置的新的MIME类型:

  •       类别(Category):type
  • 内容类型(Content-Type): magnus-internal/wincgi
  • 文件后缀(File Suffix):输入希望服务器能将其与Windows CGI关联的文件后缀。如果激活了CGIWinCGIshell CGI文件类型,就必须为每种类型的CGI指定不同的后缀。例如,不能将后缀.exe 同时使用于CGI程序和shell CGI 程序。如果需要这样做,可以编辑该页的其它MIME类型域,以使后缀唯一。

9. 点击New Type按钮。

10.   进入服务器实例页,并且选择应用改变(Apply Changes)按钮。

Windows Shell CGI程序


本节讨论如何在Windows下安装Shell CGI 程序。本节包含下列主题:

Windows Shell CGI 程序概述

Shell CGI是一项服务器配置,允许使用Windows中设置的文件关联运行CGI应用。

例如,如果服务器请求一个叫做hello.pl shell CGI文件,服务器使用Windows文件关联来运行使用.pl扩展名的程序。如果.pl 扩展名和程序C:\bin\perl.exe相关联,服务器希望按如下方式执行hello.pl 文件:

c:\bin\perl.exe hello.pl

配置shell CGI的最简单的方法是在服务器的文档根目录下创建一个目录,该目录仅包含shell CGI文件。不过,通过编辑Sun Java System Application ServerMIME类型也可以将特定文件扩展和shell CGI关联起来。


注意

如果想获得关于如何设置Windows 文件扩展名的更多信息请参考Windows 文档。


指定Shell CGI目录(Windows)

要指定包含shell CGI程序(并且仅包含shell CGI程序)的目录,可以:

1. 在计算机上创建shell CGI目录。该目录不一定是你的文档根目录下的子目录。所以在步骤7中必须指定URL前缀。

2. 在服务器实例下打开HTTP服务器组件。

3. 进入虚拟服务器页。

4. 点击要指定的shell CGI 目录所在的虚拟服务器的名字。

5. 点击CGI标签。

6. 点击Shell CGI目录选项。

7. URL前缀域中,输入该目录使用的URL前缀。也就是,输入的文本作为URLCGI程序的目录。

例如,如果输入cgi-bin 作为URL前缀,那么所有指向这些CGI程序的URL具有下面的结构:

http://yourserver.domain.com/cgi-bin/program-name


注意

指定的URL前缀可以和前面步骤中指定的实际的CGI目录不同。


8. Shell CGI目录文本域中,在目录位置中输入绝对路径。

9. 点击OK 按钮。

10.   进入服务器实例页并选择应用改变(Apply Changes)按钮。

11.   确保shell CGI目录中的任何文件在Windows中也有关联文件。在试图运行没有文件扩展关联的文件时,服务器会返回一个错误。


警告

服务器必须具有对shell CGI目录的读取和执行的权限。在Windows中,服务器运行的用户账号(例如,LocalSystem)必须具有读取和执行shell CGI目录中程序的权限。


点击该目录的shell CGI目录页中的删除(Remove)按钮可以删除现有的shell CGI 目录。点击该目录的编辑(Edit)按钮可以改变现有目录的URL前缀或shell CGI 目录。

shell CGI程序复制到指定的目录中。记住,这些目录中的任何文件都作为shell CGI文件处理。

指定Shell CGI的文件类型(Windows)

可以使用Sun Java System Application Server mime.types 文件将文件扩展和shell CGI特性关联起来。这与在Windows中创建关联不同。

为了将文件扩展和服务器上的shell CGI特性关联起来,例如,可以为带有.p1扩展名的文件创建一个关联。当服务器接收到一个对带有该扩展的文件的请求时,服务器知道应该将该文件作为shell CGI文件,调用执行Windows中该文件扩展名关联。

将文件扩展和shell CGI 文件关联起来,执行下列步骤:

1. Administration界面的服务器实例下打开HTTP服务器组件。

2. 进入虚拟服务器页。

3. 点击要指定的Windows CGI文件类型所在的虚拟服务器的名字。

4. 注意虚拟服务器的MIME类型文件名。.

5. 进入MIME类型文件页。

6. 点击与步骤4中提到的名字相匹配的名字。

7. 点击MIME File... 按钮。

8.