啓用父路徑對網站安全的詳實介紹

對包含文件的深入瞭解:   
    
“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中啓用父路徑,不被黑客利用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章