伺服器端的包含指令

來源:互聯網
上載者:User
伺服器


     利用伺服器端的包含(SSI)語句(或者指令)能夠做些什麼呢?實際上不多,除非打算建立在Web伺服器上啟動並執行可執行檔,並通過stdin和stdout函數訪問ISAPI。這就意味能夠用C、C++或其他語言(如Delphi)等編寫它們,但VB並不適合。此外,使用SSI指令能夠做的事情可達到與在ASP中實現同樣好的效果。許多方法中,IIS的SSI特性對使用這些特性的原有的Web網站和Web頁面具有向下相容性。
然而,可能有時會希望在網站上使用SSI而不是ASP。在IIS 5.0中,伺服器端的包含指令能夠比以前更加容易地整合到一個遠端站台上的ASP頁,它們是有用的,特別是作為執行作業系統命令或原有的CGI應用程式的一種方式。後面將會非常詳細地介紹可用的指令。
#include指令是這些指令之一,它已經與ASP一起使用了一段時間了,同樣也在SSI頁中使用。事實上,這已經對那些不具備傳統的Web開發背景的ASP開發人員帶來了很多混亂。

4.2.1 不可思議的ASP #include指令
在一個ASP頁中,可以使用#include指令把另一個檔案的內容插入到當前的頁面中:
<!-- #include file=”/scripts/usefulbits.inc” -->
這條指令讀取該檔案的全部內容並插入到該頁中,替代<!-- #include.. -->行。這是一種非常有用的插入HTML段落的技術,可反覆使用。也常用該指令來插入程式碼片段。例如,如果有一個包含幾個指令碼函數(或者只是單行指令碼代碼)的檔案同時在幾個頁面中使用,則可以使用#include指令將其插入到需要它的每個頁中。
通過把指令碼和內容分開的方法,給頁面提供了一個組成層次。這意味著如果對指令碼進行了修改,在用戶端再次開啟該頁面時,指令碼的修改情況自動地反映到使用包含檔案的每個頁面中。包含檔案也是一種插入伺服器特定的資訊的簡單方法,所以把網站轉移到另一個伺服器不意味著必須編輯涉及原來伺服器的所有頁面(明顯的例子是資料庫連接字串或指定一個完整的URL或伺服器名字的連結)。這可以極大地減少維護費用。
例如,可以把下面的內容作為一個包含檔案,命名為connect.inc:
<%
strConnect = “SERVER=myserver;DATABASE=mydb;DRIVER={SQL Server};” _
& “UID=username;PWD=secretpassword”
%>
然後可以在任何頁中使用這個檔案:
<!-- #include file=”path_to_fileconnect.inc” -->
<%

strTheConnectionString = strConnect ‘From include file

%>
使用包含檔案的另一種情況是有些內容需要按指定的時間間隔進行修改。例如,在Wrox Web Deverloper網站上顯示書目列表的網頁,它包含了一個表,其中提供了所有的封面、書名和一些按鈕,如圖4-2所示:

這個表的HTML和文本保留在一個單獨的檔案中,該檔案通過一條單獨的#include語句包含在首頁中。每次一本新書加入到該網頁所基於的資料庫中時,那個包含文字檔根據該資料庫的情況重新建立,並作為一個文字檔寫到磁碟上。
這個技術大大減少了在Web伺服器和資料庫伺服器上的工作量,對該網站的訪問者實現較快地響應。
1. 包含檔案和ASP
在ASP網頁(即帶有.asp副檔名的網頁)中使用的#include指令不能像一條真正的SSI指令那樣進行處理,它僅是一條ASP能夠識別並進行文法分析的特別指令。ssinc.dll直接用於執行SSI #include指令。然而這個由相應檔案的內容替代#include指令的頁面由ASP解釋。
這意味著ASP對#include指令所進行的操作不實施控制。例如,可以實驗以下代碼:
<%
‘This will *not* work
strIncludeURL = Request.Form(“FileName”)
%>

<!-- #include file=”<% = strIncludeURL %>” -->
ssinc.dll將尋找名為<% = strIncludeURL %>的檔案,並且不可能找到,因此這段代碼不會工作。
2. 包含檔案的安全性
如果沒有包含可執行指令碼,在Web伺服器上的ASP網頁不能通過IIS的Web服務程式下載到一個用戶端。但是,有人已經發現了偶然的安全性漏洞,比如著名的$DATA問題,所有在NTFS格式化的磁碟上保留Web內容的Web伺服器都存在相應的問題。在IIS 5.0中這個問題已經得到解決。
$DATA問題的出現是因為在Windows NTFS磁碟機上的所有檔案都有一個預設的“值”,即是該檔案的內容,並且通過檔案名稱加尾碼“::$DATA”來指示。將其增加到一個ASP網頁的URL的末尾將打亂IIS中的指令碼映射關係,且允許伺服器不對其中包含的指令碼進行處理而不載該頁面。對IIS 4.0和早期版本,有一個方法可以解決這個問題,或者可以只是增加幾個映射來強制IIS正常地執行該網頁:即增加對“.asp::$DATA”和“.asa::$DATA”的映射,兩者都指向asp.dll檔案。
包含檔案的擴充各一般是.inc或.txt。如果在網站上發現一個包含檔案的路徑和檔案名稱,可通過把包含檔案的URL鍵入到瀏覽器的地址欄中,下載該包含檔案,而不會把其作為ASP網頁的一部分來執行。為防止出現這樣情況,特別是在檔案包含有敏感資訊(諸如一個資料庫連結字串)的情況下,可能希望包含檔案的副檔名為.asp。在這種情況下,如果試圖下載一個包含檔案,它將首先被傳送到ASP,ASP將執行該檔案中的所有指令碼代碼,並只發送出結果。如在包含檔案中定義的一個連結字串如下:
<%
strConnect = “SERVER=myserver;DATABASE=mydb;DRIVER={SQL Server};” _
& “UID=username;PWD=secretpassword”
Response.Write vbCrlf ‘Output a carriage return character
%>
用戶端只能接受到單個斷行符號符而不是指令碼代碼,因為該檔案已經被ASP在伺服器上執行了。如果不包含斷行符號符,瀏覽器將掛起並等待一個響應(這並不是我們的問題,因為我們確實不打算允許使用者直接存取這個檔案)。
IIS 5.0和Windows的存取控制清單
在IIS 5.0中,Microsoft已經改變了Web伺服器和作業系統訪問伺服器端包含檔案的方法。
在IIS早期版本中,當ssinc.dll載入一個虛擬URL(即使用VIRTUAL = “filename”而不是FILE = “filename”)定位的一個包含檔案時,將繞過Windows本身的安全性檢查並忽略該檔案及所儲存的目錄上的任何安全性設定。現在,在IIS 5.0中,運行當前ASP或SSI頁面的帳號必須與對該檔案和目錄在Windows存取控制清單(ACL)中設定的許可權相一致。如果不一致,該SSI指令運行將失敗。

4.2.2 伺服器端包含指令概要
除了已經討論過的#include語句以外,還有IIS支援的五條伺服器端包含指令(記住,除#include以外,這些語句不能在ASP網頁中執行)。這些伺服器端包含指令及說明如表4-1所示:
表4-1 伺服器端包含指令及說明
指 令
說 明

#include
把一個指定檔案的內容插入到將被發送給用戶端的響應流中並代替該指令。例如:
<!-- #include FILE = “usefulbits.inc” -->
這條指令把名為usefulbits.inc檔案的內容插入到響應中。這個檔案可以由一個相對或全路徑與檔案名稱的組合描述,如FILE=”..scriptsmyscr.inc”。通過使用VIRTUAL屬性,可使用一個虛擬相對或絕對路徑來描述它,例如:
<!-- #include VIRTUAL=”/mysite/ussefulbits.inc” -->
<!-- #include VIRTUAL=”../../thisbit/usefulbits.inc” -->

#config
說明在其後的指令中將用於資料、時間和檔案大小以及返回給用戶端的一般性的SSI錯誤資訊的文本的格式。例如:
<!-- #config ERRMSG=”SSI Processing Error” -->
設定SSI錯誤資訊內容為'SSI Processing Error'。
<!-- #config TIMEFMT=”%A,%B %d %Y %H:%M:%S” -->
設定由其後的SSI指令返回的日期和時間的格式。這個例子設定一個格式風格:Saturday, August 14 1999 10:34:50。可以用于格式字串的標誌的列表在附錄C中給出。
<!-- #config SIZEFMT=”BYTES” -->
設定由其後的IIS指令返回的檔案大小的單位。這個例子設定單位為位元組。對SIZEFMT可供選擇的值是“ABBREV”,指明計算值將KB(KB)返迴文件的大小

#echo
把一個HTTP環境變數的值插入到發送給用戶端的響應流中並替換該指令。例如:
<!-- #echo VAR=”SERVER_NAME” -->
寫出正在執行指令到該網頁的伺服器的名字

#exec
執行一個程式或一個伺服器外殼命令,例如:
<!-- #exec CGI=”/scripts/myapp.exe?value1=this&value2=that -->
執行名為myapp.exe的CGI程式,允許傳遞查詢字串,程式在單獨記憶體中執行。
<!-- #exec CMD=”cmd.exe/c iisreset/stop” -->
啟動特定作業系統命令直譯器(cmd.exe)並執行命令iisreset/stop。/c表示當命令結束時,命令直譯器也結束。使用CMD要添加下列登錄機碼:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/w3SVC
/Parameters/SSIEnableCmdDirective
設定值為1,並重啟動WWW服務,就允許CMD標誌用於#exec指令中。值為0,則禁止使用,並防止未驗證的使用

#flastmod
把一個指定的檔案上一次修改的日期和時間插入到發送給用戶端的響應流中並代替該指令。
例如:
<!-- #flastmod FILE=”Default.asp” -->
像#include指令一樣,也可以使用虛擬路徑對該檔案進行定義,如:
VIRTUAL=”/mysite/usefulbits.inc”

VIRTUAL=”../thisbit/usefulbits.inc”

#fsize
把一個指定的檔案的大小插入到發送給用戶端的響應流中並代替該指令。例如:
<!-- #fsize FILE=”Default.asp” -->
象#include指令一樣,也可以使用虛擬路徑對該檔案進行定義,如:
VIRTUAL=”/mysite/usefulbits.inc”

VIRTUAL=”../thisbit/usefulbits.inc”


1. IISRESET公用程式
iisreset.exe是由IIS 5.0提供的一個新的公用程式。作為一個命令列的公用程式,如果用於執行該公用程式的帳號具有管理員權限,它對於控制運行在本地或一個網路電腦上的Internet連網伺服器是非常有用的。它可用於以正確的順序停止或啟動所有的服務、顯示服務的狀態、重新引導伺服器以及允許或禁止服務的管理。例如:
iisreset /RESTART /TIMEOUT:30 /REBOOTONERROR
這將以正確的順序停止和重新啟動所有Internet服務。如果一種服務在指定的逾時周期(30秒)內未能停止或重新啟動,伺服器將重新引導。可以用在CMD類型的#echo SSI指令中的一些開關,使該頁面不能進行匿名訪問並且要求使用者提供在目標伺服器上具有管理員權限的有效帳號的詳細情況。這個公用程式的完整描述和可用的命令開關在附錄C中。
2. NET STOP和NET START命令
如果用來執行公用程式net.exe的帳號具有管理員權限,它可以用來管理伺服器上啟動並執行任何服務(即可以是本地的也可以是來自其他的一個電腦)。雖然不提倡把該程式用於Internet服務(如WWW或FTP服務),但其停止和啟動其他服務的功能是非常有用的。事實上,net命令同樣可以用於一系列的其他網路相關命令。
文法是:
net [start | stop] service_name
例如,可以用命令net stop cisvc和net start cisvc來停止和啟動Miscrosoft Indexing Service。可以用CMD類型的#echo SSI指令使該頁面不能進行匿名訪問並要求使用者提供在目標伺服器上的具有管理員權限的有效帳號的詳細情況。稍後將看到一個這樣的例子。
在windows 2000協助檔案中可以找到net命令的所有選項和開關的一個完整列表。從Start菜單中選擇Help項,在Help視窗的Index頁尋找“netcommands”。
4.2.3 伺服器端包含指令的例子
本節提供了一些樣本頁面,可以用來對各種伺服器端包含語句進行實驗。開啟樣本網頁的子目錄Chapter04,顯示“SSI Directives and the ASP Server Object”首頁(即子目錄Chapter04中的Default.asp),如圖4-3所示:

本書的所有樣本都可以從我們的Web網站下載。讀者將在樣本的子目錄Chapter04中發現本章其餘部分的所有樣本頁面。
1. 使用SSI/CGI處理指示
單擊連結進入“Server-Side Include and CGI Statements”頁面,這將開啟ssi_cgi.stm頁面。需要注意的是該頁面的副檔名為.stm,表明這不是一個ASP網頁。該頁面使用了前面已經討論過的除#exec指令(稍後將看到)以外的所有SSI指令,且顯示指令的使用方法和結果,如圖4-4所示:

(1)#include指令
該頁的開始部分“Include Files with SSI”,顯示名為intro.inc的另一個單獨檔案的內容。下面是該檔案的全部內容:
注意我們必須使用HTML條目“<”和“>”來顯示網頁中的角括弧。如果不這樣做,它們就不能被當作註解元素部分看待,並引起其中的指令被執行。
在主ssi_cgi.stm頁面中,把這個檔案插入到該頁中的代碼是很簡單的:
<!-- #include file=”intro.inc” -->
(2)#config、#fsize和#flastmod指令
網頁下一部分顯示了與該頁面在相同的目錄中的檔案Default.asp的大小和最後被修改的時間。這裡三次使用了#config指令:
· 一次是設定SSI錯誤資訊。
· 一次是設定日期和時間的格式。
· 一次是設定檔案大小計算的格式。
使用#fsize和#fiastmod指令把值插入到該網頁中:
<P><DIV CLASS="subhead">SSI Statements</DIV>
<!-- #config ERRMSG="SSI Processing Error" -->
(sets error message in case of SSI error)<BR>
<!-- #config ERRMSG="SSI Processing Error" --><P>

Details of file 'Default.asp':<BR>
<!-- #config SIZEFMT="BYTES" -->
(sets fsize to return size in bytes)<BR>
<!-- #config SIZEFMT="BYTES" -->

<!-- #fsize FILE="Default.asp" -->
returns: <B><!-- #fsize FILE="Default.asp" --> bytes</B><BR>

<!-- #config TIMEFMT="%A, %B %d %Y %H:%M:%S" -->
(sets format for date/time results)<BR>
<!-- #config TIMEFMT="%A, %B %d %Y %H:%M:%S" -->

<!-- #flastmod FILE="Default.asp" -->
returns: <B><!-- #flastmod file="Default.asp" --></B><P>
(3)#echo 指令
該頁的最後部分(在螢幕上只能看到一部分)顯示可以使用#echo指令訪問的所有HTTP前序的內容。每一行的代碼都是相同的,僅僅是VAR屬性值有變化。附錄G中給出了VAR屬性的所有容許值的一個完整列表。
<DIV CLASS="subhead">HTTP Variables</DIV>
<!-- #echo VAR="AUTH_TYPE" -->
returns: <B><!-- #echo var="AUTH_TYPE" --></B><BR>
<!-- #echo VAR="AUTH_PASSWORD" -->
returns: <B><!-- #echo var="AUTH_PASSWORD" --></B><BR>
… etc …
2. 使用#exec指令
#exec指令與其他的SSI指令相比使用起來困難一些,正因為如此,將其獨立地放到了另一個頁面上。可以從“ASP Server Object and SSI Directives”主菜單上訪問啟動頁面。
在該頁面上,選擇“Using the #echo Server-Side Include Directive”連結。這個操作開啟“The SSI #exec Directive”頁面,如圖4-5所示:

這是一個ASP網頁ssi_exec.asp。兩個按鈕用來開啟.stm頁面,該頁面執行其中使用#exec指令所描述的動作。
(1) 在伺服器上運行這個樣本
在SSI #exec指令樣本能夠在伺服器上工作之前,必須對一些配置進行修改。首先,需要在Web伺服器的註冊表中建立SSIEnableCmdDirective項(類型DWORD),位置在下面的鍵名下:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW3SVCParameters
然後設定該值為1,如圖4-6所示:

這樣就允許#exec指令與CMD屬性一起使用。
其次,必須對包含使用#exec指令的.stm檔案的目錄禁止匿名訪問,用戶端將被強制提供帳號的詳細情況,該帳號應是一個具有管理員級許可權帳號。這也是net命令正常工作的要求。
啟用Internet Services Manager應用程式,並選擇包含使用#exec指令的.stm檔案的目錄(在樣本中,這些檔案是exec目錄下的start_cisvc.stm和stop_cisvc.stm)。然後開啟該目錄的Properties對話方塊。在Directory Security選項卡中單擊Anonymous access and authentication control地區中的Edit按鈕,開啟 Authentication Methods對話方塊,如圖4-7所示:

這個對話方塊不選中Anonymous access複選框。如果不使用Internet Explorer訪問該頁面,開啟Basic authentication選項以允許非IE瀏覽器通過提交使用者名稱/口令訪問該頁面。設定時,會出現一個有關安全的警告,單擊Yes。現在瀏覽器將被強制出示合適的帳號和身份證明,因為不能匿名訪問該網頁。
為了能看到啟動和終止服務的結果,開啟“Services MMC外掛程式”,終止Indexing Service,如圖4-8所示:

(2) 啟動和終止Indexing Service
單擊樣本Web網頁上的按鈕,啟動Microsoft Indexing Service。
這個服務的簡短名稱為cisvc,它通常稱為Microsoft Index Server,名稱中的“ci”字元,實際上代表“content indexer”。
出現提示時,輸入在Web伺服器上的具有管理員權限的一個帳號的使用者名稱和口令。當該頁面(start_cisvc.stm)開啟時,你將感覺到一定的延遲,這是因為#exec指令載入一個視窗命令直譯器(cmd.exe)的執行個體,然後執行net start命令。一旦服務啟動(或者如果已經在運行),將顯示該頁面的其餘部分,如圖4-9所示:

這個頁面的代碼十分簡單。可以看到#exec指令帶有CMD屬性,它設定為“cmd.exe /c net start cisvc”。表單包含有重新回到前一頁面的SUBMIT按鈕:
<P>Processing the SSI directive:</P>
<P><B><!-- #exec CMD="cmd.exe /c net stop cisvc" --></B></P>
<!-- #exec CMD="cmd.exe /c net stop cisvc" -->

<FORM ACTION="../ssi_exec.asp">
<INPUT TYPE="SUBMIT" NAME="cmdOK" VALUE=" ">
Return to the previous page<P>
</FORM>
從前一頁面可以開啟其他的.stm網頁,如stop_cisvc.stm用來再次終止該服務,不同之處僅在於使用了net stop命令而不是net start命令。

<!-- #exec CMD=”cmd.exe /c net stop cisvc” -->




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。