5月阅读周·HTTP权威指南:发布系统之FrontPage为支持发布而做的服务器扩展篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议)是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
发布系统
怎样创建Web页面并放到Web服务器上去呢?在Web发展的“蛮荒”时代(比如1995年),可能要在文本编辑器中手工拼凑HTML,用FTP手动把内容上传到Web服务器。这个过程很痛苦,很难与同事配合,也不是特别安全。如今的发布工具使得创建、发布以及管理Web内容方便了许多。今天,用户可以交互式地编辑Web内容,在屏幕上看到它实际呈现的样子,轻轻点击一下就可以把内容发布到服务器,还能得到所有文件变化的通知。
FrontPage为支持发布而做的服务器扩展
FrontPage(FP)是微软公司提供的一种通用Web写作和发布工具包。FrontPage的原始创意(FrontPage 1.0)是由维美尔(Vermeer)技术公司在1994年构思的,它是首个把网站管理和创建整合进一个统一工具的产品。微软公司1996年收购了维美尔公司,发行了FrontPage 1.1。最新的版本——FrontPage 2002版,是这条产品线上的第六代,是微软办公套件的核心组成部分。
FrontPage服务器扩展
作为“随处发布”战略的一部分,微软公司发布了一系列服务器端软件,称为“FrontPage服务器扩展”,(FPSE)。这些服务器端组件和Web服务器集成在一起,在网站和运行FrontPage的客户端(以及其他支持这些扩展的客户端)之间提供了必要的转接工作。
我们主要关注FrontPage客户端和FPSE之间的发布协议。该协议是对HTTP核心服务进行扩展而无需改变HTTP语义的一个设计范例。FrontPage的发布协议在HTTP的POST请求之上实现了一个RPC(Remote Procedure Call,远程过程调用)层。它允许FrontPage客户端向服务器发送命令来更新网站上的文档、进行搜索以及在多个Web作者之间进行协作,等等。
FrontPage术语表
在我们深入研究FPSE定义的RPC层之前,先来了解一下其常用术语。
虚拟服务器:在同一服务器上运行的多个网站之一,每个都有唯一的域名和IP地址。本质上说,虚拟服务器允许在单一的Web服务器上托管多个网站,在浏览器看来每个网站都像是由它自己专门的Web服务器托管的一样。支持虚拟服务器的Web服务器称为多路托管(multi-hosting)Web服务器。配置有多个IP地址的机器称为多宿主(multi-homed)服务器。
根Web:Web服务器默认的顶层内容目录,或者是在多路托管环境下,虚拟Web服务器的顶层内容目录。要访问根Web,只需指定该服务器的URL,而不需要指定页面名称。每个Web服务器只能有一个根Web。
子Web:根Web的已命名子目录或另一个完全由FPSE扩展的子Web。子Web可以是完全独立的实体,能够指定自己的管理和写作权限。此外,子Web还能提供方法(比如搜索)的作用范围。
FrontPage的RPC协议
FrontPage客户端与FPSE使用专用的RPC协议来通信。该协议构建在HTTP的POST方法之上,它把RPC的方法及其相关的变量嵌入在POST请求的主体中。
在开始处理之前,客户端需要知道服务器上目标程序(FPSE包中能够执行这些POST请求的相关部分)的位置和名称。接下来它会发送一个特殊的GET请求。
得到返回的文件之后,FrontPage客户端读取响应,寻找与FPShtmlScriptUrl、FPAuthorScriptUrl以及FPAdminScriptUrl相关的值。通常,这些值看起来是这样的:
FPShtmlScriptUrl="_vti_bin/_vti_rpc/shtml.dll"
FPAuthorScriptUrl="_vti_bin/_vti_aut/author.dll"
FPAdminScriptUrl="_vti_bin/_vti_adm/admin.dll"
FPShtmlScriptUrl告诉客户端要执行“浏览时”命令(例如,获取FPSE的版本号)时应向哪里POST请求。FPAuthorScriptUrl告诉客户端要执行“写作时”命令时应向哪里POST请求。类似地,FPAdminScriptUrl告诉FrontPage向哪里发送管理操作的POST请求。现在我们已知道这些程序所在的位置,可以发出请求了。
1、请求
POST请求的主体包含RPC命令,形式是method=<command>及任何需要的参数。例如,请求文档列表的RPC报文如下:
POST /_vti_bin/_vti_aut/author.dll HTTP/1.1
Date: Sat, 12 Aug 2000 20:32:54 GMT
User-Agent: MSFrontPage/4.0
..........................................
<BODY>
method=list+documents%3a4%2e0%2e2%2e3717&service%5fname=&listHiddenDoc
s=false&listExplorerDocs=false&listRecurse=false&listFiles=true&listFo
lders=true&listLinkInfo=true&listIncludeParent=true&listDerived=false
&listBorders=false&listChildWebs=true&initialUrl=&folderList=%5b%3bTW%
7c12+Aug+2000+20%3a33%3a04+%2d0000%5d
POST方法的主体中含有发送给FPSE的RPC命令。与CGI程序一样,方法中的空格被编码为加号(+)字符。所有其他非字母数字的字符都被编码为%XX格式,XX表示该字符的ASCII码。根据这种记号方式,更容易辨识的主体版本如下所示:
method=list+documents:4.0.1.3717
&service_name=
&listHiddenDocs=false
&listExplorerDocs=false
.....
其中某些元素的含义如下所述。
- service_name:方法应该在该URL表示的网站上执行。必须是已有文件夹或者已有文件夹的下层文件夹。
- listHiddenDocs:如果值为true,就显示网站中隐藏的文档。所谓“隐藏”是指其URL的路径部分以“ ”开头。
- listExploreDocs:如果值为true,就列出任务列表。
2、响应
大多数RPC协议方法都有返回值。大多数常见的返回值都用来表示方法成功和各种错误。有些方法还有第三种类别的返回值,称为“采样返回码”。FrontPage会对这些代码进行适当的解释,为用户提供准确的反馈。
继续讨论前面的例子,FPSE处理这个listdocuments请求并返回必须的信息。示例响应如下:
HTTP/1.1200 OK
Server: Microsoft-IIS/5.0
Date: Sat, 12 Aug 2000 22:49:50 GMT
Content-type: application/x-vermeer-rpc
X-FrontPage-User-Name: IUSER_MINSTAR
<html><head><title>RPC packet</title></head>
<body>
<p>method=list documents: 4.0.2.3717
<p>document_list=
<ul>
<li>document_name=help.gif
<\ul>
可以从响应中看到,Web服务器上可用文档的列表返回给了FrontPage客户端。在微软公司的网站上可以找到各种命令和响应的完整列表。
FrontPage的安全模型
任何直接访问Web服务器内容的发布系统都要非常注意其行为的潜在安全影响。FPSE在极大程度上是依赖Web服务器来提供安全性的。
FPSE安全模型定义了3种用户:管理员、作者以及浏览者,其中管理员拥有完全控制权。所有权限都是累积的,也就是说,所有的管理员都能编写和浏览FrontPage的网站。类似地,所有作者都有浏览权限。
对于给定的由FPSE扩展的网站,管理员、作者以及浏览者的列表都要定义好。所有的子Web可以从根Web继承权限,也可以自行定义。对于非IIS的Web服务器,所有的FPSE程序都要保存在标记为“可执行”的目录中(所有其他CGI程序也都有同样的限制)。Fpsrvadm, FrontPage的服务器管理员实用工具,可以用来进行这种工作。在IIS服务器上,则可用Windows操作系统自身集成的安全模型。
在非IIS服务器上,Web服务器的访问控制机制负责指定能够访问指定程序的用户。在Apache和NCSA的Web服务器上,访问控制文件名为.htaccess;在Netscape服务器上,文件名是.nsconfig。访问控制文件将用户、用户组以及IP地址与不同级别的权限关联起来:GET是读权限,POST是写权限,等等。例如,为了使用户在Apache的Web服务器上具有作者权限,.htaccess文件应当允许该用户对author.exe进行POST。这些访问规范文件常常是以目录为单位来定义的,这为权限定义提供了极大的灵活性。
在IIS服务器上,权限是通过给定根Web目录或子Web的根目录上的ACL(Access Control List,访问控制列表)来制定的。当IIS收到请求时,首先登录,并模拟用户,接着发送请求到上述三个DLL(Dynamic Link Library,动态链接库)之一。收到请求的DLL根据目标文件夹上定义的ACL检查所扮演用户的证书。如果检查通过,请求的操作就由扩展DLL来执行。否则,就向客户端发回“permission denied”(没有权限)报文。由于IIS和Windows操作系统的安全管理紧密集成在一起,所以可以使用用户管理器进行细粒度的控制。
尽管有着精密的安全模型,启用FPSE还是背负了带来显著安全风险的恶名。在多数情况下,这是由于网站管理员的粗心大意引起的。然而,早期版本的FPSE的确有严重的安全漏洞,从而引起了这种安全风险的担忧。完整地实现严密的安全模型困难重重,也加剧了这种担忧。
总结
Web服务器看到以FPSE(在非微软IIS服务器上就以一组CGI程序的方式实现)为接收地址的POST请求,就对其进行相应的引导。只要中间的防火墙和代理服务器都配置为允许使用POST方法,FrontPage就能与服务器持续通信。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)