青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

道。道。道

安全特性不等于安全的特性

   :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理

常用鏈接

搜索

  •  

最新評(píng)論

說(shuō)明:本文中所有程序均在Windows 2000 Server中文版 + SP2上編譯運(yùn)行無(wú)誤
開發(fā)環(huán)境:.Net 框架1.0 Version 1.0.3705

  一、ASP.NET虛擬主機(jī)存在的重大隱患

  我曾經(jīng)在WWW.BRINKSTER.COM申請(qǐng)了一個(gè)免費(fèi)的ASP.NET空間,上傳了兩個(gè)程序,其中一個(gè)查看目錄和文件的程序證明我的判斷:ASP共享空間服務(wù)器存在的一個(gè)安全問(wèn)題,在 ASP+ 共享空間服務(wù)器中依然存在并且變得更加難以防范!通過(guò)這個(gè)程序我可以瀏覽所有用戶的ASP+程序,可以查看服務(wù)器的系統(tǒng)日志……,當(dāng)然,如果我想刪除什么的話也不會(huì)有什么問(wèn)題。為了讓大家更清楚地了解這一問(wèn)題,我們有必要簡(jiǎn)單介紹一下ASP中就已經(jīng)存在的這一問(wèn)題。

  ASP中常用的標(biāo)準(zhǔn)組件:FileSystemObject,這個(gè)組件為 ASP 提供了強(qiáng)大的文件系統(tǒng)訪問(wèn)能力,可以對(duì)服務(wù)器硬盤上的任何有權(quán)限的目錄和文件進(jìn)行讀寫、刪除、改名等操作。FSO對(duì)象來(lái)自微軟提供的腳本運(yùn)行庫(kù)scrrun.dll中。

  使用下面的代碼就可以在ASP中創(chuàng)建一個(gè)FSO對(duì)象:

  Set fso = CreateObject("Scripting.FileSystemObject")

  我們使用fso對(duì)象包含的屬性和方法,如Drive、Drives、Folder、Floders、File、Files等對(duì)服務(wù)器的磁盤、目錄和文件進(jìn)行讀、寫、刪除等操作。這一強(qiáng)大的文件系統(tǒng)訪問(wèn)能力給ASP共享空間提供者帶來(lái)了嚴(yán)重的安全問(wèn)題,很多ASP空間的管理員都刪除此組件或?qū)⑦@個(gè)組件改名以避免用戶使用這一標(biāo)準(zhǔn)組件。刪除組件或組件改名確實(shí)是一個(gè)簡(jiǎn)單的方法并且也很有效,但是卻使廣大用戶無(wú)法使用它的強(qiáng)大的功能。網(wǎng)絡(luò)上還有一種看起來(lái)很美的方案,它允許用戶使用 FileSystemObject 組件又不影響服務(wù)器的安全,即對(duì)每一個(gè)用戶都設(shè)置一個(gè)獨(dú)立的服務(wù)器用戶和單個(gè)目錄的操作權(quán)限。但是這種方法是有問(wèn)題的。因?yàn)锳SP和ASP.NET中在這方面的問(wèn)題十分類似,所以我們將在ASP.NET的相應(yīng)解決辦法部分詳加說(shuō)明。

  在ASP.NET中我們發(fā)現(xiàn)這一問(wèn)題仍然存在,并且變得更加難以解決。這是因?yàn)?NET中關(guān)于系統(tǒng)IO操作的功能變得更加強(qiáng)大,而使這一問(wèn)題更嚴(yán)重的是ASP.NET所具有的一項(xiàng)新功能,這就組件不需要象ASP那樣必須要使用regsvr32來(lái)注冊(cè)了,只需將Dll類庫(kù)文件上傳到bin目錄下就可以直接使用了。這一功能確實(shí)給開發(fā)ASP.NET帶來(lái)了很大的方便,但是卻使我們?cè)贏SP中將此dll刪除或者改名的解決方法失去效用了,防范此問(wèn)題就變得更加復(fù)雜。在討論解決方案之前,我們先來(lái)看一下怎么來(lái)實(shí)現(xiàn)上述的危險(xiǎn)的功能。
  二、文件系統(tǒng)操作示例

  在我們編寫代碼之前,有必要了解一下我們需要用到的幾個(gè)主要的類。這幾個(gè)類都在System.IO名稱空間下,System.IO 名稱空間包含允許在數(shù)據(jù)流和文件上進(jìn)行同步和異步讀寫的類。

  在整個(gè)應(yīng)用程序的開始部分我們需要了解一下服務(wù)器的系統(tǒng)信息,這就需要用到System.Environment類,該類提供有關(guān)當(dāng)前環(huán)境和平臺(tái)的信息以及操作它們的方法。我們通過(guò)System.Environment類可以得到系統(tǒng)的當(dāng)前目錄和系統(tǒng)目錄,這可以使我們更快的發(fā)現(xiàn)幾個(gè)關(guān)鍵的目錄;我們還可以通過(guò)獲取運(yùn)行當(dāng)前進(jìn)程的用戶名來(lái)幫助我們了解ASP.NET程序運(yùn)行所使用的用戶,進(jìn)一步設(shè)置用戶權(quán)限以避免這一安全問(wèn)題。

  我們還要使用System.IO名稱空間的其他幾個(gè)類是:

  System.IO.Directory:提供用于創(chuàng)建、移動(dòng)和枚舉通過(guò)目錄和子目錄的靜態(tài)方法的類

  System.IO.File:提供用于創(chuàng)建、復(fù)制、刪除、移動(dòng)和打開文件的靜態(tài)方法的類

  System.IO.FileInfo:提供創(chuàng)建、復(fù)制、刪除、移動(dòng)和打開文件的實(shí)例方法的類

  System.IO.StreamReader:實(shí)現(xiàn)一個(gè) TextReader,使其以一種特定的編碼從字節(jié)流中讀取字符。

  每個(gè)我們所使用的類的屬性和方法的具體用法我們將以代碼注釋的方式在程序中加以說(shuō)明。

  System.IO名稱空間在 .NET FRAMEWORK提供的mscorlib.dll中,在使用VS.Net編程之前需要將此Dll引用到此項(xiàng)目中。

  我們所編寫的程序都使用了Codebehind方式,即每一個(gè)aspx程序都有一個(gè)對(duì)應(yīng)的aspx.cs程序,aspx程序中只是寫與頁(yè)面顯示相關(guān)的代碼,所有邏輯實(shí)現(xiàn)的代碼都放在相應(yīng)的aspx.cs文件中,這樣就可以更好得做到顯示與邏輯的分離。由于我們的目的不是討論Codebehind技術(shù),所以就不在對(duì)此多加討論了。

  在這篇文章里,我們只介紹幾個(gè)主要的類及其關(guān)鍵方法的用法,詳細(xì)程序請(qǐng)查看附帶的源代碼。

  程序一:顯示服務(wù)器的當(dāng)前信息和全部邏輯驅(qū)動(dòng)器的名稱的程序listdrivers.aspx

  主要方法1:我們使用 GetSysInf() 方法來(lái)得到服務(wù)器的當(dāng)前環(huán)境和平臺(tái)的信息

//獲取系統(tǒng)信息的方法,此方法在listdrivers.aspx.cs文件中
public void GetSysInf () {
//獲取操作系統(tǒng)類型
qDrives = Environment.OSVersion.ToString();
//獲取系統(tǒng)文件夾
qSystemDir = Environment.SystemDirectory.ToString();
/*獲取映射到進(jìn)程上下文的物理內(nèi)存量,通過(guò)這一內(nèi)存映射量可以了解ASP.NET程序在運(yùn)行時(shí)需要多少系統(tǒng)物理內(nèi)存,有助于更好的規(guī)劃我們的整個(gè)應(yīng)用,因?yàn)槲锢韮?nèi)存量是以Byte為單位的,所以我們將此數(shù)值除以1024,可以得到單位為KB的物理內(nèi)存量*/
qMo = (Environment.WorkingSet/1024).ToString();
//獲取當(dāng)前目錄(即該進(jìn)程從中啟動(dòng)的目錄)的完全限定路徑
qCurDir = Environment.CurrentDirectory.ToString();
//獲取主機(jī)的網(wǎng)絡(luò)域名
qDomName = Environment.UserDomainName.ToString();
//獲取系統(tǒng)啟動(dòng)后經(jīng)過(guò)的毫秒數(shù)
qTick = Environment.TickCount;
//計(jì)算得到系統(tǒng)啟動(dòng)后經(jīng)過(guò)的分鐘數(shù)
qTick /= 60000;
//獲取機(jī)器名
qMachine = Environment.MachineName;
//獲取運(yùn)行當(dāng)前進(jìn)程的用戶名
qUser = Environment.UserName;
/*檢索此計(jì)算機(jī)上格式為"<驅(qū)動(dòng)器號(hào)>:\"的邏輯驅(qū)動(dòng)器的名稱,返回字符串?dāng)?shù)組,這是下一步操作的關(guān)鍵所在*/
achDrives = Directory.GetLogicalDrives();
//獲取此字符串?dāng)?shù)組的維數(shù),確定有多少個(gè)邏輯驅(qū)動(dòng)器
nNumOfDrives = achDrives.Length;
}


  系統(tǒng)信息不需要進(jìn)行操作,我們簡(jiǎn)單的用asp:Label將他們顯示出來(lái)就行了。邏輯驅(qū)動(dòng)器的個(gè)數(shù)在不同的服務(wù)器上是不定的,所以用不定長(zhǎng)數(shù)組保存邏輯驅(qū)動(dòng)器的名稱,而且邏輯驅(qū)動(dòng)器的名稱也是我們下一步瀏覽目錄和文件的基礎(chǔ),故我們采用了數(shù)據(jù)網(wǎng)格DataGrid來(lái)顯示和處理它。

  顯示和處理邏輯驅(qū)動(dòng)器名稱的DataGrid的代碼(代碼在listdrivers.aspx文件):

<asp:DataGrid id="DriversGrid" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundColumn HeaderText="ID" DataField="ID" />
<asp:BoundColumn HeaderText="磁盤名" DataField="Drivers" />
<asp:HyperLinkColumn
HeaderText="詳細(xì)信息"
DataNavigateUrlField="Drivers" DataNavigateUrlFormatString="listdir.aspx?dir={0}"
DataTextField="Detail"
Target="_new" />
</Columns>
</asp:DataGrid>

  前兩個(gè)BoundColumn列都是顯示序號(hào)和實(shí)際邏輯驅(qū)動(dòng)器名稱的,需要說(shuō)明的是第三列,我們?cè)谶M(jìn)入各個(gè)邏輯驅(qū)動(dòng)器顯示目錄和文件之前需要將所選擇的邏輯驅(qū)動(dòng)器的名稱傳遞到顯示目錄的文件去,所以需要一個(gè)特殊的超級(jí)鏈接行HyperLinkColumn,我們將DataNavigateUrlField設(shè)置為數(shù)據(jù)源中要綁定到 HyperLinkColumn 中的超級(jí)鏈接的 URL 的字段,在此即邏輯驅(qū)動(dòng)器名稱。然后將DataNavigateUrlFormatString設(shè)置為當(dāng) URL 數(shù)據(jù)綁定到數(shù)據(jù)源中的字段時(shí),此HyperLinkColumn中的超級(jí)鏈接的 URL 的顯示格式,即要鏈接到的下一級(jí)處理頁(yè)面,在此為listdir.aspx?dir={用戶點(diǎn)擊行的邏輯驅(qū)動(dòng)器名稱}
創(chuàng)建數(shù)據(jù)源的代碼(代碼在listdrivers.aspx.cs文件中):




//通過(guò)此方法返回一個(gè)集合形式的數(shù)據(jù)視圖DataView
ICollection CreateDataSource() {
//定義內(nèi)存中的數(shù)據(jù)表DataTable
DataTable dt = new DataTable();
//定義DataTable中的一行數(shù)據(jù)DataRow
DataRow dr;
/*向DataTable中增加一個(gè)列,格式:DataColumn("Column", type)
Column為數(shù)據(jù)列的名字,type為數(shù)據(jù)列的數(shù)據(jù)類型*/
dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("drivers", typeof(string)));
dt.Columns.Add(new DataColumn("detail", typeof(string)));
//使用for循環(huán)將邏輯驅(qū)動(dòng)器的名稱以行的形式添加到數(shù)據(jù)表DataTable中
for (int i = 0; i < nNumOfDrives; i++) {
//定義新行
dr = dt.NewRow();
//對(duì)行中每列進(jìn)行賦值,注意要與上邊定義的DataTable的行相對(duì)應(yīng)
dr[0] = i; //循環(huán)生成的序號(hào)
dr[1] = achDrives[i].ToString(); //邏輯驅(qū)動(dòng)器的名稱
dr[2] = "查看詳情";
//向DataTable中添加行
dt.Rows.Add(dr);
}
//根據(jù)得到的DataTable生成自定義視圖DataView
DataView dv = new DataView(dt);
//返回得到的視圖DataView
return dv;
}

  我們通過(guò)這個(gè)方法得到了一個(gè)包含所有我們需要的數(shù)據(jù)的數(shù)據(jù)視圖DataView,我們只需要在此aspx頁(yè)的Page_Load方法中將此數(shù)據(jù)視圖綁定到DataGrid上就可以了。

  數(shù)據(jù)綁定代碼(代碼在listdrivers.aspx.cs文件中):

/* 設(shè)置DataGrid的數(shù)據(jù)源DataSource為我們從CreateDataSource()方法得到的數(shù)據(jù)視圖DataView */
DriversGrid.DataSource = CreateDataSource();
//將此DataGrid進(jìn)行數(shù)據(jù)綁定
DriversGrid.DataBind();


  通過(guò)上邊介紹的幾種主要方法我們就實(shí)現(xiàn)了獲取系統(tǒng)信息和顯示所有邏輯驅(qū)動(dòng)器名稱的功能,并且可以通過(guò)相應(yīng)的鏈接進(jìn)入下一個(gè)顯示目錄和文件名的程序listdir.aspx顯示該邏輯驅(qū)動(dòng)器下的所有目錄和文件。

  程序二:顯示目錄中所有子目錄和文件的程序listdir.aspx

  目錄下有子目錄和文件兩種形式,必須分別對(duì)待。我們調(diào)用此程序本身對(duì)子目錄進(jìn)行列表顯示,而文件我們需要調(diào)用showfile.aspx程序?qū)ξ募膶傩院蛢?nèi)容進(jìn)行顯示。并且兩者還有不同的刪除方法,所以我們?cè)谶@里設(shè)置了兩個(gè)DataGrid,兩個(gè)DataTable,兩個(gè)DataView,分別處理和顯示目錄和文件。

  顯示和處理目錄和文件的DataGrid的代碼(代碼在listdir.aspx文件):

  顯示目錄或文件的序號(hào)和名稱的數(shù)據(jù)列類似于listdrivers.aspx程序中的相應(yīng)代碼,這里就不再重復(fù)了。對(duì)于子目錄和文件分別有各自的處理頁(yè)面,所以需要導(dǎo)航到兩個(gè)不同的頁(yè)面,對(duì)于子目錄,我們繼續(xù)使用listdir.aspx程序?qū)ζ湎碌淖幽夸浐臀募M(jìn)行列表顯示:

<asp:HyperLinkColumn DataNavigateUrlField="DirName"
DataNavigateUrlFormatString="listdir.aspx?dir={0}"
DataTextField="DirDetail"
HeaderText="詳細(xì)信息"
Target="_new"
/>
對(duì)于文件,我們使用showfile.aspx程序顯示其屬性和內(nèi)容:
<asp:HyperLinkColumn DataNavigateUrlField="FileName"
DataNavigateUrlFormatString="showfile.aspx?file={0}"
DataTextField="FileDetail"
HeaderText="詳細(xì)信息"
Target="_new"
/>

  在兩個(gè)DataGrid(DirGrid,F(xiàn)ileGrid)中我們分別設(shè)置了兩個(gè)HyperLinkColumn列來(lái)導(dǎo)航到不同的處理頁(yè)面。

  在兩個(gè)DataGrid中我們都使用了一個(gè)刪除的按鈕列:

<asp:ButtonColumn HeaderText="刪除"
Text="刪除"
CommandName="Delete"
/>

  由于添加、更新、刪除功能列都是DataGrid的默認(rèn)模板列,所以可以在Vs.net中通過(guò)DataGrid的屬性生成器自動(dòng)添加此列。

  獲取上一頁(yè)面所傳遞來(lái)的參數(shù)的代碼:

  因?yàn)樵谙旅娈a(chǎn)生數(shù)據(jù)源的方法中需要使用由上一個(gè)頁(yè)面?zhèn)鬟f過(guò)來(lái)的參數(shù)來(lái)確定目錄和文件的名稱,所以在頁(yè)面的Page_Load方法里使用了下列代碼:

strDir2List = Request.QueryString["dir"];

  字符串strDir2List即傳過(guò)來(lái)的目錄名或文件名。

  因?yàn)槲覀兪褂昧藘蓚€(gè)DateGrid,就需要進(jìn)行兩次數(shù)據(jù)綁定,就有兩個(gè)不同的生成數(shù)據(jù)源的方法。

  生成目錄數(shù)據(jù)網(wǎng)格(DirGrid)數(shù)據(jù)源的方法:

//通過(guò)此方法返回一個(gè)集合形式的數(shù)據(jù)視圖DataView,用來(lái)初始化子目錄的DataGrid
ICollection CreateDataSourceDir() {
dtDir = new DataTable();
DataRow dr;
//向DataTable中添加新的數(shù)據(jù)列,共四列
dtDir.Columns.Add(new DataColumn("DirID", typeof(Int32)));
dtDir.Columns.Add(new DataColumn("DirName", typeof(string)));
dtDir.Columns.Add(new DataColumn("DelDir", typeof(string)));
dtDir.Columns.Add(new DataColumn("DirDetail", typeof(string)));
//根據(jù)傳入的參數(shù)(目錄名)得到此目錄下所有子目錄名的字符串?dāng)?shù)組
string [] DirEntries = Directory.GetDirectories(strDir2List);
//使用foreach循環(huán)可以對(duì)未知長(zhǎng)度的數(shù)組進(jìn)行遍歷循環(huán)
foreach(string DirName in DirEntries){
dr = dtDir.NewRow();
dr[0] = i;//序號(hào)
dr[1] = DirName;//文件夾名稱
dr[3] = "刪除";
dr[3] = "查看詳情";
dtDir.Rows.Add(dr);
i++;
}
DataView dvDir = new DataView(dtDir);
//返回得到的數(shù)據(jù)視圖
return dvDir;
}
生成文件數(shù)據(jù)網(wǎng)格(FileGrid)數(shù)據(jù)源的方法:
//通過(guò)此方法返回一個(gè)集合形式的數(shù)據(jù)視圖DataView,用來(lái)初始化文件的DataGrid
ICollection CreateDataSourceFile() {
dtFile = new DataTable();
DataRow dr;
dtFile.Columns.Add(new DataColumn("FileID", typeof(Int32)));
dtFile.Columns.Add(new DataColumn("FileName", typeof(string)));
dtFile.Columns.Add(new DataColumn("DelFile", typeof(string)));
dtFile.Columns.Add(new DataColumn("FileDetail", typeof(string)));
//根據(jù)傳入的參數(shù)(目錄名)得到此目錄下所有文件名的字符串?dāng)?shù)組
string [] FileEntries = Directory.GetFiles(strDir2List);
foreach(string FileName in FileEntries){
dr = dtFile.NewRow();
dr[0] = i;
dr[1] = FileName;
dr[2] = "刪除";
dr[3] = "查看詳情";
dtFile.Rows.Add(dr);
i++;
}
dvFile = new DataView(dtFile);
return dvFile;
}

  我們編程實(shí)現(xiàn)了兩個(gè)DataSource只需在頁(yè)面的Page_Load方法里對(duì)兩個(gè)DataGrid進(jìn)行數(shù)據(jù)綁定即可將得到的DataTable中的數(shù)據(jù)顯示在aspx頁(yè)面的DataGrid上。

  數(shù)據(jù)綁定代碼:

//對(duì)子目錄數(shù)據(jù)列表DirGrid進(jìn)行數(shù)據(jù)源定義和數(shù)據(jù)綁定
DirGrid.DataSource = CreateDataSourceDir();
DirGrid.DataBind();
//對(duì)文件數(shù)據(jù)列表FileGrid進(jìn)行數(shù)據(jù)源定義和數(shù)據(jù)綁定
FileGrid.DataSource = CreateDataSourceFile();
FileGrid.DataBind();

  通過(guò)我們上邊介紹的主要方法,我們實(shí)現(xiàn)了對(duì)某個(gè)邏輯驅(qū)動(dòng)器或目錄中的所有子目錄和文件進(jìn)行了列表顯示,并且可以根據(jù)顯示結(jié)果更進(jìn)一步的瀏覽子目錄或者查看文件的屬性和內(nèi)容提要。瀏覽子目錄仍然是通過(guò)listdir.aspx這個(gè)程序,沒(méi)有任何子目錄級(jí)別要求,沒(méi)有目錄深度限制。
  刪除子目錄和文件的主要方法和代碼:

  在刪除子目錄時(shí),我們需要用到Directory.Delete (string,bool)方法,此方法有兩種:

  1.public static void Delete(string);

  從指定路徑刪除空目錄。

  2.public static void Delete(string, boolean);

  刪除指定的目錄并(如果指示)刪除該目錄中的任何子目錄,將boolean設(shè)置為true的話,則刪除此目錄下的所有子目錄和文件,否則將boolean設(shè)置為false。

  在這里我們使用了第二種方法,如果選擇刪除的話,將刪除此目錄下的所有子目錄和文件。

  注意:Directory 類的所有方法都是靜態(tài)的,因而無(wú)需具有目錄Directory的實(shí)例就可被調(diào)用。

/*實(shí)現(xiàn)刪除子目錄的方法,此方法為VS.NET自動(dòng)添加,注意DataGridCommandEventArgs e為DirGrid中 CommandName="Delete" 的ButtonColumn的事件,通過(guò)此事件,我們可以得到是那一行的ButtonColumn按鈕列被點(diǎn)擊,進(jìn)而確定我們需要?jiǎng)h除的子目錄的名稱*/
private void DirGrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e){
/*定義一個(gè)單元格,e.Item為此事件所發(fā)生行的所有項(xiàng)目,e.Item.Cells[1]為整個(gè)行的第二個(gè)單元格的內(nèi)容,在此DataGrid中為子目錄的名稱
*/
TableCell ItemCell = e.Item.Cells[1];
//得到此子目錄的名稱的字符串
string item = ItemCell.Text;
//刪除此子目錄
Directory.Delete(item,true);
//刪除后進(jìn)行數(shù)據(jù)綁定以更新數(shù)據(jù)列表
DirGrid.DataBind();
}

  在刪除文件時(shí),我們需要用到File.Delete(string path);

  注意:File 類的所有方法都是靜態(tài)的,因而無(wú)需具有目錄的實(shí)例就可被調(diào)用。

private void FileGrid_DeleteCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e) {
TableCell ItemCell = e.Item.Cells[1];
//得到此文件名稱的字符串
string item = ItemCell.Text;
//刪除此文件
File.Delete(item);
//刪除后進(jìn)行數(shù)據(jù)綁定以更新數(shù)據(jù)列表
DirGrid.DataBind();
}

  通過(guò)上邊的主要方法我們?cè)陧?yè)面上實(shí)現(xiàn)了一個(gè)刪除某一個(gè)子目錄或者文件的功能,此功能在測(cè)試時(shí)需要慎重使用,一旦刪除無(wú)法通過(guò)常規(guī)方法恢復(fù)。其他如目錄或文件改名、修改內(nèi)容等方法都可以在此程序基礎(chǔ)上添加相應(yīng)的功能,實(shí)現(xiàn)方法也很簡(jiǎn)單。各位愛(ài)好者可以通過(guò)添加相應(yīng)功能,使之?dāng)U充為一個(gè)基于Web的服務(wù)器文件管理系統(tǒng)。我們也可以由此看到這個(gè)程序的危害性,一個(gè)沒(méi)有對(duì)此安全隱患采取防范措施的服務(wù)器的文件系統(tǒng)就都暴露在了使用此程序的用戶面前。
  程序三:顯示文件屬性和內(nèi)容的程序showfile.aspx

  在顯示屬性和內(nèi)容時(shí)需要用到的兩個(gè)主要的類:

  System.IO.FileInfo:提供創(chuàng)建、復(fù)制、刪除、移動(dòng)和打開文件的實(shí)例方法,并且?guī)椭鷦?chuàng)建 FileStream 對(duì)象。

  System.IO.StreamReader:實(shí)現(xiàn)一個(gè) TextReader,使其以一種特定的編碼從字節(jié)流中讀取字符。除非另外指定,StreamReader的默認(rèn)編碼為 UTF-8,而不是當(dāng)前系統(tǒng)的 ANSI 代碼頁(yè)。UTF-8 可以正確處理 Unicode 字符并在操作系統(tǒng)的本地化版本上提供一致的結(jié)果。

  Showfile.aspx頁(yè)面主要代碼:

<asp:Label id="FileDetail" runat="server"/>

  我們只是將文件的屬性信息和部分內(nèi)容顯示在此Label上。所以沒(méi)有其他復(fù)雜的代碼。

  獲取文件信息和內(nèi)容的主要代碼都在Page_Load方法中(代碼在showfile.aspx.cs文件中):

//接收傳入的參數(shù),確定需要操作的文件名稱
strFile2Show = Request.QueryString["file"];
//根據(jù)文件名實(shí)例化一個(gè)FileInfo對(duì)象
FileInfo fi = new FileInfo(strFile2Show);
FileDetail.Text = "文件名:";
FileDetail.Text += strFile2Show+"<br>";
FileDetail.Text += "文件大小";
//獲得文件的大小,然后變換單位為KB
FileDetail.Text += (fi.Length/1024).ToString()+"K<br>";
FileDetail.Text += "創(chuàng)建文件時(shí)間:";
//獲得文件的創(chuàng)建日期
FileDetail.Text += fi.CreationTime.ToString();
FileDetail.Text += "上次訪問(wèn)時(shí)間:";
//獲得文件的上次訪問(wèn)日期
FileDetail.Text += fi.LastAccessTime.ToString()+"<br>";
FileDetail.Text += "上次寫入時(shí)間:";
//獲得文件的上次寫入日期
FileDetail.Text += fi.LastWriteTime.ToString()+"<br>";
//實(shí)例化一個(gè)StreamReader對(duì)象,用于讀取此FileInfo的內(nèi)容
StreamReader FileReader = fi.OpenText();
//定義一個(gè)長(zhǎng)度為1000的字符數(shù)組作為緩沖區(qū)
char[] theBuffer = new char[1000];
/*ReadBlock方法:從當(dāng)前流中讀取最大數(shù)量的字符并從索引開始將該數(shù)據(jù)寫入緩沖區(qū)。
參數(shù):
char[] buffer:方法返回時(shí),包含指定的字符數(shù)組
int index:buffer 中開始寫入的位置
int count:最多讀取的字符數(shù)
*/
int nRead = FileReader.ReadBlock(theBuffer,0,1000);
FileDetail.Text += new String(theBuffer,0,nRead);
//關(guān)閉此 StreamReader 并釋放與之關(guān)聯(lián)的所有系統(tǒng)資源
FileReader.Close();

  到目前為止,我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的web頁(yè)面的服務(wù)器磁盤管理應(yīng)用程序,可以查看、刪除目錄和文件。如果需要修改文件、新建文件和文件夾等功能,只需稍作修改,添加上相應(yīng)的代碼就可以。由于我們只是通過(guò)這個(gè)程序說(shuō)明服務(wù)器中存在的安全隱患,所以在這里就不再實(shí)現(xiàn)這些功能了。

  通過(guò)這三個(gè)簡(jiǎn)單的程序,我想大家已經(jīng)能夠清楚的認(rèn)識(shí)到這一漏洞的危害性了,如果我們不加防范的話,其他用戶的程序就能被惡意使用此功能的用戶查看、刪除,服務(wù)器的系統(tǒng)日志、系統(tǒng)文件也沒(méi)有任何安全可言了。

posted on 2007-08-07 15:56 獨(dú)孤九劍 閱讀(90) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Learn articles
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美连裤袜在线视频| 亚洲午夜在线| 午夜久久一区| 久久精品欧洲| 一区二区亚洲| 亚洲成人在线免费| 欧美国产日韩一二三区| 久久久av水蜜桃| 老巨人导航500精品| 欧美高清视频一区二区| 一区二区激情| 欧美成人精品h版在线观看| 亚洲欧美日韩综合一区| 日韩午夜一区| 国产精品视频导航| 日韩网站在线| 亚洲精品精选| 亚洲女人av| 亚洲综合色丁香婷婷六月图片| 国产麻豆一精品一av一免费| 欧美成在线视频| 欧美日韩久久| 国外成人在线视频| 欧美高清视频一区二区| 亚洲免费电影在线观看| 一区二区三区不卡视频在线观看 | 欧美国产一区二区三区激情无套| 免费一级欧美片在线观看| 久久综合一区二区| 久久精品视频在线播放| 国产精品久久久久999| 亚洲精品视频在线播放| 亚洲一区二区三区在线看| 亚洲欧美在线网| 亚洲女爱视频在线| 一区二区久久| 在线亚洲一区| 久久精品一区二区| 国内在线观看一区二区三区| 国产日韩专区| 久久一区二区三区国产精品| 欧美黄色影院| 亚洲日本免费电影| 亚洲精品日韩在线| 艳妇臀荡乳欲伦亚洲一区| 午夜精品福利在线| 国产女主播在线一区二区| 久久性天堂网| 国产精品r级在线| 欧美国产日韩视频| 亚洲欧美电影院| 欧美久久久久久久| 亚洲清纯自拍| 亚洲激情网站| 国产精品99久久99久久久二8 | 一本色道久久综合亚洲精品婷婷| 亚洲综合日韩中文字幕v在线| 欧美一级久久久久久久大片| 亚洲高清资源| 久久一区激情| 久久久久国色av免费看影院| 欧美国产精品久久| 亚洲夜间福利| 亚洲自拍偷拍福利| 欧美日韩免费一区| 亚洲另类自拍| 欧美成人激情在线| 久久久久久黄| 亚洲精品久久久久中文字幕欢迎你 | 久久精彩免费视频| 免费看黄裸体一级大秀欧美| 亚洲欧美日韩国产一区二区| 久久免费的精品国产v∧| 亚洲国产成人精品久久久国产成人一区 | 亚洲欧洲在线一区| 免费看av成人| 午夜精品亚洲一区二区三区嫩草| 欧美电影免费观看高清| 亚洲第一中文字幕| 日韩视频―中文字幕| 亚洲精品中文字| 欧美国产一区视频在线观看| 久久国产精品久久国产精品| 久久精品一区蜜桃臀影院| 国产亚洲一区二区三区| 亚洲国产成人不卡| 欧美成人一品| 久久精品国产第一区二区三区| 一本色道婷婷久久欧美| 国产视频亚洲精品| 亚洲人成在线观看| 狠狠狠色丁香婷婷综合久久五月 | 久久亚洲国产成人| 亚洲午夜在线| 欧美精品一区三区| 欧美大成色www永久网站婷| 亚洲综合久久久久| 国模精品一区二区三区| 国产一区二区三区在线观看免费视频| 亚洲精品久久久一区二区三区| 在线视频国产日韩| 亚洲第一在线| 国产精品美女久久久| 亚洲国产福利在线| 亚洲乱码久久| 欧美一级黄色网| 日韩亚洲精品视频| 久久精品在线观看| 亚洲综合日韩在线| 亚洲精品中文字| 精品99视频| 在线视频欧美日韩精品| 永久555www成人免费| 久热精品视频在线观看| 欧美日韩一区二区三区四区五区| 久久久精品国产一区二区三区| 麻豆精品在线播放| 亚洲电影视频在线| 午夜一区二区三区在线观看| av不卡在线| 亚洲视频欧洲视频| 亚洲精品国产拍免费91在线| 久久精品免费播放| 久久精品视频va| 国产原创一区二区| 亚洲欧美成人网| 校园春色综合网| 午夜精品视频| 欧美怡红院视频| 久久精彩视频| 免费日韩成人| 亚洲黄色影片| 欧美久久在线| 亚洲视频在线视频| 欧美一级一区| 国产在线观看一区| 亚洲午夜激情免费视频| 国产精品女同互慰在线看| 午夜精品久久久久久久| 美女视频黄 久久| 亚洲激情成人| 国产精品成人v| 久久aⅴ国产紧身牛仔裤| 亚洲欧洲日产国产网站| 欧美日本中文| 久久精品99国产精品| 亚洲精品一区二区三区不| 欧美在线欧美在线| 欧美精品乱人伦久久久久久| 亚洲欧美日韩精品久久| 极品中文字幕一区| 欧美日韩亚洲一区| 卡通动漫国产精品| 这里只有精品视频| 在线激情影院一区| 欧美三级视频在线播放| 免费不卡在线视频| 亚洲综合成人在线| 亚洲人成毛片在线播放| 国产精品久久久久久久久久久久 | 亚洲国产成人在线| 久久久xxx| 亚洲欧美日韩系列| 亚洲天堂偷拍| 亚洲精品一区在线观看香蕉| 亚洲大片在线观看| 在线观看视频一区二区| 国内一区二区三区在线视频| 国产精品美女一区二区| 欧美精品综合| 欧美性猛交99久久久久99按摩 | 激情欧美一区二区三区在线观看| 国产精品二区在线观看| 国产精品videosex极品| 欧美日产国产成人免费图片| 欧美日韩亚洲一区二区三区在线观看| 久久人人爽国产| 欧美不卡视频一区发布| 欧美精品18| 欧美日韩一区二区三| 国产精品爽黄69| 黑人操亚洲美女惩罚| 一区在线免费观看| 夜夜爽夜夜爽精品视频| 亚洲一二三区在线| 久久精品91久久久久久再现| 另类av导航| 日韩天天综合| 久久久久国产精品人| 亚洲啪啪91| 妖精成人www高清在线观看| 日韩一区二区免费高清| 亚洲男同1069视频| 牛牛精品成人免费视频| 亚洲在线第一页| 日韩亚洲视频| 久久精品在线| 国产欧美日韩综合一区在线观看| 激情欧美日韩一区| 欧美一区二区三区在线看|