ASP.NET虛擬主機之文件系統操作隱患淺析
ASP.NET虛擬主機之文件系統操作隱患是在我們編寫代碼之前,有必要了解一下我們需要用到的幾個主要的類。這幾個類都在System.IO名稱空間下,System.IO 名稱空間包含允許在數據流和文件上進行同步和異步讀寫的類。
在整個應用程序的開始部分我們需要了解一下服務器的系統信息,這就需要用到System.Environment類,該類提供有關當前環境和平臺的信息以及操作它們的方法。我們通過System.Environment類可以得到系統的當前目錄和系統目錄,這可以使我們更快的發現幾個關鍵的目錄;我們還可以通過獲取運行當前進程的用戶名來幫助我們了解ASP.NET程序運行所使用的用戶,進一步設置用戶權限以避免這一安全問題。
我們還要使用System.IO名稱空間的其他幾個類是:
System.IO.Directory:提供用于創建、移動和枚舉通過目錄和子目錄的靜態方法的類
System.IO.File:提供用于創建、復制、刪除、移動和打開文件的靜態方法的類
System.IO.FileInfo:提供創建、復制、刪除、移動和打開文件的實例方法的類
System.IO.StreamReader:實現一個 TextReader,使其以一種特定的編碼從字節流中讀取字符。
每個我們所使用的類的屬性和方法的具體用法我們將以代碼注釋的方式在程序中加以說明。
System.IO名稱空間在 .NET FRAMEWORK提供的mscorlib.dll中,在使用VS.Net編程之前需要將此Dll引用到此項目中。
我們所編寫的程序都使用了Codebehind方式,即每一個aspx程序都有一個對應的aspx.cs程序,aspx程序中只是寫與頁面顯示相關的代碼,所有邏輯實現的代碼都放在相應的aspx.cs文件中,這樣就可以更好得做到顯示與邏輯的分離。由于我們的目的不是討論Codebehind技術,所以就不在對此多加討論了。
在這篇文章里,我們只介紹幾個主要的類及其關鍵方法的用法,詳細程序請查看附帶的源代碼。
程序一:顯示服務器的當前信息和全部邏輯驅動器的名稱的程序listdrivers.aspx
主要方法1:我們使用 GetSysInf() 方法來得到服務器的當前環境和平臺的信息
- //獲取系統信息的方法,此方法在listdrivers.aspx.cs文件中
- public void GetSysInf () {
- //獲取操作系統類型
- qDrives = Environment.OSVersion.ToString();
- //獲取系統文件夾
- qSystemDir = Environment.SystemDirectory.ToString();
- /*獲取映射到進程上下文的物理內存量,通過這一內存映射量可以了解ASP.NET程序在運行時需要多少系統物理內存,
- 有助于更好的規劃我們的整個應用,因為物理內存量是以Byte為單位的,
- 所以我們將此數值除以1024,可以得到單位為KB的物理內存量*/
- qMo = (Environment.WorkingSet/1024).ToString();
- //獲取當前目錄(即該進程從中啟動的目錄)的完全限定路徑
- qCurDir = Environment.CurrentDirectory.ToString();
- //獲取主機的網絡域名
- qDomName = Environment.UserDomainName.ToString();
- //獲取系統啟動后經過的毫秒數
- qTick = Environment.TickCount;
- //計算得到系統啟動后經過的分鐘數
- qTick /= 60000;
- //獲取機器名
- qMachine = Environment.MachineName;
- //獲取運行當前進程的用戶名
- qUser = Environment.UserName;
- /*檢索此計算機上格式為"﹤驅動器號﹥:\"的邏輯驅動器的名稱,返回字符串數組,這是下一步操作的關鍵所在*/
- achDrives = Directory.GetLogicalDrives();
- //獲取此字符串數組的維數,確定有多少個邏輯驅動器
- nNumOfDrives = achDrives.Length;
- }
ASP.NET虛擬主機之文件系統操作隱患在系統信息不需要進行操作,我們簡單的用asp:Label將他們顯示出來就行了。邏輯驅動器的個數在不同的服務器上是不定的,所以用不定長數組保存邏輯驅動器的名稱,而且邏輯驅動器的名稱也是我們下一步瀏覽目錄和文件的基礎,故我們采用了數據網格DataGrid來顯示和處理它。
顯示和處理邏輯驅動器名稱的DataGrid的代碼(代碼在listdrivers.aspx文件):
- ﹤asp:DataGrid id="Drivers﹥Grid" runat="server" AutoGenerateColumns="false"﹥
- ﹤Columns
- ﹤asp:BoundColumn HeaderText="ID" DataField="ID" /﹥
- ﹤asp:BoundColumn HeaderText="磁盤名" DataField="Drivers" /﹥
- ﹤asp:HyperLinkColumn
- HeaderText="詳細信息"
- DataNavigateUrlField="Drivers" DataNavigateUrlFormatString="listdir.aspx?dir={0}"
- DataTextField="Detail"
- Target="_new" /﹥
- ﹤/Columns﹥
- ﹤/asp:DataGrid﹥
前兩個BoundColumn列都是顯示序號和實際邏輯驅動器名稱的,需要說明的是第三列,我們在進入各個邏輯驅動器顯示目錄和文件之前需要將所選擇的邏輯驅動器的名稱傳遞到顯示目錄的文件去,所以需要一個特殊的超級鏈接行HyperLinkColumn,我們將DataNavigateUrlField設置為數據源中要綁定到 HyperLinkColumn 中的超級鏈接的 URL 的字段,在此即邏輯驅動器名稱。然后將DataNavigateUrlFormatString設置為當 URL 數據綁定到數據源中的字段時,此HyperLinkColumn中的超級鏈接的 URL 的顯示格式,即要鏈接到的下一級處理頁面,在此為listdir.aspx?dir={用戶點擊行的邏輯驅動器名稱}
ASP.NET虛擬主機之文件系統操作隱患的相關信息就向你介紹到這里,希望對此你有所了解。
【編輯推薦】