對包含文件的深入瞭解:
“Server-side include”命令提供了一種方式,可在 Web 服務器處理文件之前在該文件中插入其他文件的內容。ASP 只執行該機制的 #include。要將文件插入 .asp 文件,可使用下面的語法:
<!-- #include virtual | file ="filename" -->
關鍵字“virtual”和“file”表示用來包含文件的路徑類型,“filename”表示想要包含文件的路徑和文件名。
被包含的文件並不要求具有特定的文件擴展名;但是,賦予被包含文件 .inc 的擴展名是一個良好的編程習慣,這樣有助於將它們與其他類型的文件區分開來。
使用 Virtual 關鍵字
使用關鍵字“virtual”來表示以虛擬目錄開始的路徑。例如,如果文件 Footer.inc 駐留在虛擬目錄 /Myapp 中,則下面的行會將 Footer.inc 的內容插入到包含該行的文件中:
<!-- #include virtual ="/myapp/footer.inc" -->
使用 File 關鍵字
使用關鍵字“file”來表示相對路徑。相對路徑以包含文件所在的路徑開始。例如,如果文件 Header1.inc 在 Myapp/Headers 中,並且 Myapp 中有一個文件,則下面的行會將 Header1.inc 插入到該文件中:
<!-- #include file ="headers/header1.inc" -->
注意,被包含文件 Headers/header1.inc 的路徑相對於包含文件;如果包含該“#include”語句的腳本不位於目錄 /Myapp 中,語句將不起作用。
也可以使用關鍵字“file”和語法 (../) 來包含父目錄或更高層目錄中的文件,但必須選中 Internet 信息服務管理單元中的“啓用上層路徑”選項。 有關說明,請參閱配置 ASP 應用程序。
被包含文件的位置
ASP 檢測被包含文件的變化(不考慮位置),並當瀏覽器下一次請求包含該文件的 .asp 文件時插入該文件內容。不過,通常說來,如果包含文件駐留在相同應用程序或 Web 站點內部,則很容易維護這些文件的安全。若需要更高安全性,最好將包含文件放到應用程序內的單獨目錄中(如 /Includes),並且只應用適當的“執行”(Web 服務器)權限。詳細信息,請參閱設置 Web 服務器權限。
要點 默認情況下,對所有文件應用 Web 服務器“讀取”權限。不過,要防止用戶查看包含文件的內容,可以禁用 Include 目錄的“讀取”權限。
包含文件:提示和警告
被包含的文件也可以包含其他文件。只要“#include”命令不導致循環,.asp 文件也可以多次包含同一文件。例如,如果文件 First.asp 包含文件 Second.inc,則 Second.inc 不能反過來包含 First.asp。文件也不能包含其自身。ASP 檢測這樣的循環或嵌套錯誤,生成錯誤消息,並停止處理請求的 .asp 文件。
ASP 在執行腳本命令之前包含文件。因此,不能使用腳本命令來建立被包含的文件名。舉例來說,因爲 ASP 試圖在將文件名指派給變量 name 之前執行“#include”命令,所以下面的腳本無法打開文件 Header1.inc。
<!-- 該腳本將失敗 -->
<% name=(header1 & ".inc") %>
<!-- #include file="<%= name %>" -->
腳本命令和過程必須完全包含在腳本分隔符 <% 和 %> 內,即 HTML 標籤 <SCRIPT> 和 </SCRIPT>,或 HTML 標籤 <OBJECT> 和 </OBJECT> 內部。也就是說,不能在包含 .asp 文件中打開腳本分隔符,並在被包含的文件中關閉分隔符;腳本或腳本命令必須是一個完整的單元。例如,下面的腳本將不起作用:
<!-- 該腳本將失敗 -->
<%
For i = 1 To n
主文件中的語句
<!-- #include file="header1.inc" -->
Next
%>
但下面的腳本會起作用:
<%
For i = 1 to n
主文件中的語句
%>
<!-- #include file="header1.inc" -->
<% Next %>
注意 如果 ASP 腳本包含的文件中存在包含腳本不需要的大量函數和變量,則這些無用的結構反而會影響性能,並最終降低 Web 應用程序的伸縮性。因此,通常將包含文件分成多個小文件,並且只包含那些服務器端腳本必需的文件,而不是包含那些帶有冗餘信息的一個或多個大型包含文件。
有時,可能需要使用 HTML <SCRIPT></SCRIPT> 標籤來包含服務器端文件。例如,下面的腳本包含服務器可以執行的文件(使用相對路徑):
<SCRIPT LANGUAGE="VBScript" RUNAT=SERVER SRC="Utils/datasrt.inc"></SCRIPT>
下表說明通過 SRC 屬性使用虛擬或相對路徑來包含文件的正確語法:
路徑類型 語法 示例:
相對 SRC="Path/Filename" SRC="Utilities/Test.asp"
虛擬 SRC="/Path/Filename" SRC="/MyScripts/Digital.asp"
虛擬 SRC="/Path/Filename" SRC="/RegApps/Process.asp"
父路徑會引起“HTTP 500 - 內部服務器錯誤”
“HTTP 500 - 內部服務器錯誤”引起的原因有多個,初學者比較常見的就是沒有啓用讓IIS支持父路徑的功能。這也是我曾經遇到的問題,在windows2000 server下調試好的程序,到了windows2003 server下便出現“HTTP 500 - 內部服務器錯誤”,當時百思不得其解。這是由於“啓用父路徑”會帶來安全問題,在windows2003上默認是不選的(見後文中引用的微軟網站的文章)。
啓用父路徑的操作步驟如下:
1、啓動IIS,在【默認網站】上右鍵單擊,在彈出的菜單中選擇【屬性】,如圖1所示;
圖1
2、單擊【屬性】菜單後,彈出如圖2所示的對話框;
圖2
3、在圖2中選擇【主目錄】屬性頁,然後單擊【配置】按鈕,彈出如圖3所示的對話框;
圖3
3、在圖3中選擇【選項】屬性頁,然後選中圖3中的“啓用父路徑”複選框。
說明:
“啓動會話狀態”,表示一個客戶如果在設定期限內沒有活動,則服務器會自動放棄保存客戶端的信息以及其他相關的信息。默認的設置時間爲20分鐘。
“啓用緩衝”,此項必須選上,因爲在ASP編程中,很多時候需要利用緩衝輸出數據。
“啓用父路徑”,ASP頁面中如果使用到了include file=../header.asp 這樣的代碼,此項必須選上,../表示上級目錄下的header.asp頁面,是用相對路徑來表示的,如果您的IIS頁面設置中的“啓用父路徑”設置爲False的情況下,訪問此頁面時就會報錯,因爲當前的IIS設置不允許使用..方式訪問父路徑,您需要將這個值設定爲true。啓用父路徑指定 ASP 頁面是否允許相對於當前目錄的路徑(使用 ../ 表示法)。如果設置爲 true,則此屬性可能會造成潛在的安全風險,因爲包含路徑可以訪問應用程序根目錄外的重要或機密的文件。如果出於安全考慮不開啓父路徑,建議路徑指向的時候寫絕對路徑,即完整地址 如[url]http://www.xxx.com/header.asp[/url] 。
“默認ASP語言”,表示在進行ASP編程的時候,默認的腳本語言VBScript或JavaScript,可以根據需要設置。也可以在程序中單獨廟宇編程腳本。
附:微軟網站:AspEnableParentPaths MetaBase 屬性應設置爲 False
症狀
默認情況下啓用活動服務器頁 (ASP) 代碼使用下列父目錄批註:
<!-- #include file="../default.htm"-->
原因
MetaBase 中 AspEnableParentPaths 屬性指定 ASP 可允許到當前目錄相對路徑 (我使用 / 表示法)。 這可能會帶來安全風險。
增強安全性的環境, 中 AspEnableParentPaths 屬性應設置爲 False, 但 Internet Information Server 4.0 的默認安裝將它設置爲 True。
注意 : 禁用 ASP 父路徑僅影響 .asp 網頁上動態內容執行。 這不會影響服務器能力來引用靜態內容使用 HTML 代碼 (是否 .htm、 .html 或 .asp 文件中調用它)。 下行 default.asp 中會正確顯示圖像不返回 ASP 0131 錯誤, 即使 AspEnableParentPaths = False:
< = img src " 按鈕 /images/logo.jpg " >
替代方法
要解決此問題, 執行以下步驟:
1. 在 Microsoft 管理控制檯打開 Internet 服務管理器。
2. 右擊 Web 服務器問題。
3. 在彈出菜單上選擇屬性。
4. 單擊主目錄選項卡。
5. 在應用程序設置框中選擇配置。
6. 單擊 App 選項選項卡。
7. 清除啓用父路徑選項。
8. 單擊確定兩次以返回到 Microsoft 管理控制檯。
狀態
Microsoft 已經確認這將 IIS 版本 4.0 和 5.0 中有問題。
引用地址:[url]http://support.microsoft.com/kb/q184717/[/url]
解決方案:摘錄下來的,,學習中....
使用SSI(Server Side Include)指令中的#Include
asp包含文件的寫法是這樣的:
在html中,寫:
<!-- #include file = "FileName" -->
<!-- #include Virtual = "FileName" -->
file和Virtual的區別在於file使用相對路徑
而Virtual是你的web站點內虛擬目錄的完整虛擬路徑
比方:
<!-- #include file = "inc/char.inc" -->
就表示包含當前文件所在的虛擬目錄路徑下面的inc目錄下的char.inc
寫成 virtual就可能就需要這麼寫了
<!-- #include virtual = "/myweb/inc/char.inc" -->
最簡單的攻防方法:
在IIS中,有時要啓用父路徑,但黑客常常利用父路徑訪問硬盤文件。因此,我使用了一種方法: 先將IIS暫停,啓用父路徑。(之所以暫停是爲了防止操作時遭攻擊)然後,在根目錄下創建虛擬路徑“..”,任意選擇一個原目錄,並將它的所有權限取消即可。經測試,這樣雖然可以用父路徑,但若訪問根目錄的父路徑,則會出現“您無權查看該網頁”的錯誤。因爲根目錄下的父路徑會被以爲成虛擬路徑“..”,而其他路徑下則可以用父路徑。 此方法在Windows Server 2003, Enterprise Edition, Service Pack 2的自帶IIS中測試通過。 參見:
參考資料:
1、http://technet.microsoft.com/zh-cn/library/cc785218(WS.10).aspx
啓用父路徑
2、http://chinesetoon.blog.51cto.com/326106/63318
未啓用父路徑而導致的HTTP 500內部服務器錯誤
3、http://doc.bsdlover.cn/html/php/2009/0531/39461.html
在IIS中啓用父路徑,不被黑客利用