[重要通告]如您遇疑難雜癥,本站支持知識(shí)付費(fèi)業(yè)務(wù),掃右邊二維碼加博主微信,可節(jié)省您寶貴時(shí)間哦!

說明:本文中所需環(huán)境為2003Server+iis6.0+ms sql2000

曾經(jīng)很早就在網(wǎng)上看到一篇關(guān)于<asp.net虛擬主機(jī)的重大隱患>的文章,當(dāng)時(shí)并不在意,做過asp虛擬主機(jī)的朋友可能都知道,即對(duì)每一個(gè)用戶都設(shè)置一個(gè)獨(dú)立的服務(wù)器用戶和單個(gè)目錄的操作權(quán)限,能夠基本上解決asp的fso問題。

在網(wǎng)上無意中發(fā)現(xiàn)了一個(gè)叫做webadmin的asp.net-webshell,對(duì)自己的服務(wù)器進(jìn)行測(cè)試的時(shí)候,讓我大吃一驚,居然對(duì)我服務(wù)器的c盤有讀取的權(quán)限。以及對(duì)整個(gè)硬盤的修改刪除權(quán)限。這樣的話,那么我的服務(wù)器的安全……

為了進(jìn)一步證實(shí),本人曾在國內(nèi)一些著名的虛擬主機(jī)提供商上作過測(cè)試,均有和我一樣的問題。

有必要先介紹一下漏洞的原因。

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

在ASP.NET中我們發(fā)現(xiàn)這一問題仍然存在,并且變得更加難以解決。這是因?yàn)?NET中關(guān)于系統(tǒng)IO操作的功能變得更加強(qiáng)大,而使這一問題更嚴(yán)重的是ASP.NET所具有的一項(xiàng)新功能,這就組件不需要象ASP那樣必須要使用regsvr32來注冊(cè)了,只需將Dll類庫文件上傳到bin目錄下就可以直接使用了。這一功能確實(shí)給開發(fā)ASP.NET帶來了很大的方便,但是卻使我們?cè)贏SP中將此dll刪除或者改名的解決方法失去效用了,防范此問題就變得更加復(fù)雜。需要進(jìn)一步了解的朋友可以看<asp.net虛擬主機(jī)的重大隱患>一文,本文就不再重復(fù)。只針對(duì)此問題引出虛擬主機(jī)的安全設(shè)置。

網(wǎng)上提出針對(duì)此問題用Microsoft .NET Framework Configration設(shè)置System.io的對(duì)目錄讀取的權(quán)限,經(jīng)過我們長(zhǎng)時(shí)間的測(cè)試沒有成功,可能是.net framework1.1機(jī)制改革了?

廢話不說。先說說解決的思路:在 IIS 6 中,Web 應(yīng)用程序的工作進(jìn)程設(shè)置為以進(jìn)程標(biāo)識(shí)“Network Service”運(yùn)行。在 IIS 5 中,進(jìn)程外 Web 應(yīng)用程序則設(shè)置為以 IWAM_<服務(wù)器名> 帳戶運(yùn)行,這個(gè)帳戶是普通的本地用戶帳戶。

Network Service 是 Windows Server 2003 中的內(nèi)置帳戶。了解 IIS 5 上的本地用戶帳戶(IUSR 和 IWAM)與這個(gè)內(nèi)置帳戶之間的區(qū)別是非常重要的。Windows 操作系統(tǒng)中的所有帳戶都分配了一個(gè) SID(安全標(biāo)識(shí),Security ID)。服務(wù)器是根據(jù) SID,而不是與 SID 相關(guān)的名稱來識(shí)別服務(wù)器上所有帳戶的,而我們?cè)谂c用戶界面進(jìn)行交互時(shí),則是使用名稱進(jìn)行交互的。服務(wù)器上創(chuàng)建的絕大部分帳戶都是本地帳戶,都具有一個(gè)唯一的 SID,用于標(biāo)識(shí)此帳戶隸屬于該服務(wù)器用戶數(shù)據(jù)庫的成員。由于 SID 只是相對(duì)于服務(wù)器是唯一的,因此它在任何其他系統(tǒng)上無效。所以,如果您為本地帳戶分配了針對(duì)某文件或文件夾的 NTFS 權(quán)限,然后將該文件及其權(quán)限復(fù)制到另一臺(tái)計(jì)算機(jī)上時(shí),目標(biāo)計(jì)算機(jī)上并沒有針對(duì)這個(gè)遷移 SID 的用戶帳戶,即使其上有一個(gè)同名帳戶也是如此。這使得包含 NTFS 權(quán)限的內(nèi)容復(fù)制可能出現(xiàn)問題。

內(nèi)置帳戶是由操作系統(tǒng)創(chuàng)建的、一類較為特別的帳戶或組,例如 System 帳戶、Network Service 和 Everyone 組。這些對(duì)象的重要特征之一就是,它們?cè)谒邢到y(tǒng)上都擁有一個(gè)相同的、眾所周知的 SID。當(dāng)將分配了 NTFS 權(quán)限的文件復(fù)制到內(nèi)置帳戶時(shí),權(quán)限在服務(wù)器之間是有效的,因?yàn)閮?nèi)置帳戶的 SID 在所有服務(wù)器上都是相同的。Windows Server 2003 服務(wù)中的 Network Service 帳戶是特別設(shè)計(jì)的,專用于為應(yīng)用程序提供訪問網(wǎng)絡(luò)的足夠權(quán)限,而且在 IIS 6 中,無需提升權(quán)限即可運(yùn)行 Web 應(yīng)用程序。這對(duì)于 IIS 安全性來說,是一個(gè)特大的消息,因?yàn)椴淮嬖诰彌_溢出,懷有惡意的應(yīng)用程序無法破譯進(jìn)程標(biāo)識(shí),或是對(duì)應(yīng)用程序的攻擊不能進(jìn)入 System 用戶環(huán)境。更為重要的一點(diǎn)是,再也不能形成針對(duì) System 帳戶的“后門”,例如,再也無法通過 InProcessIsapiApps 元數(shù)據(jù)庫項(xiàng)利用加載到 Inetinfo 的應(yīng)用程序。

Network Service 帳戶在創(chuàng)建時(shí)不僅僅考慮了在 IIS 6 中的應(yīng)用。它還具有進(jìn)程標(biāo)識(shí) W3WP.exe 的絕大部分(并不是全部)權(quán)限。如同 ASPNET 用戶為了運(yùn)行 ASP.net 應(yīng)用程序,需要具有 IIS 5 服務(wù)器上某些位置的訪問權(quán)限,進(jìn)程標(biāo)識(shí) W3WP.exe 也需要具有類似位置的訪問權(quán)限,而且還需要一些默認(rèn)情況下沒有指派給內(nèi)置組的權(quán)限。

為了管理的方便,在安裝 IIS 6 時(shí)創(chuàng)建了 IIS_WPG 組(也稱為 IIS 工作進(jìn)程組,IIS Worker Process Group),而且它的成員包括 Local System(本地系統(tǒng))、Local Service(本地服務(wù))、Network Service(網(wǎng)絡(luò)服務(wù))和 IWAM 帳戶。IIS_WPG 的成員具有適當(dāng)?shù)?NTFS 權(quán)限和必要的用戶權(quán)限,可以充當(dāng) IIS 6 中工作進(jìn)程的進(jìn)程標(biāo)識(shí)。

因此,Network Service 帳戶提供了訪問上述位置的權(quán)限,具有充當(dāng) IIS 6 工作進(jìn)程的進(jìn)程標(biāo)識(shí)的充足權(quán)限,以及具有訪問網(wǎng)絡(luò)的權(quán)限。

Msdn上說:在 Windows Server 2003 中,用戶上下文稱為 NETWORK SERVICE。這些用戶帳戶是在 .NET Framework 安裝過程中創(chuàng)建的,它具有唯一的不易破解的密碼,并僅被授予有限的權(quán)限。ASPNET 或 NETWORK SERVICE 用戶只能訪問運(yùn)行 Web 應(yīng)用程序所需的特定文件夾,如 Web 應(yīng)用程序存儲(chǔ)已編譯文件的 \bin 目錄。

要將進(jìn)程標(biāo)識(shí)設(shè)置為特定用戶名,以取代 ASPNET 或 NETWORK SERVICE 用戶標(biāo)識(shí),您提供的用戶名和密碼都必須存儲(chǔ)在 machine.config 文件中。

但是根據(jù)實(shí)際情況,asp.net的system.io可以無限制訪問不設(shè)防的服務(wù)器路徑。不知道這算不算一個(gè)ms的重大漏洞。而且根本不能使iis以machine.config的用戶執(zhí)行asp.net程序。J

如何解決呢?答案就是—應(yīng)用程序池。

IIS 6.0 在被稱為應(yīng)用程序隔離模式(隔離模式)的兩種不同操作模式下運(yùn)行,它們是:工作進(jìn)程隔離模式和 IIS 5.0 隔離模式。這兩種模式都要依賴于 HTTP.sys 作為超文本傳輸協(xié)議 (HTTP) 偵聽程序;然而,它們內(nèi)部的工作原理是截然不同的。

工作進(jìn)程隔離模式利用 IIS 6.0 的重新設(shè)計(jì)的體系結(jié)構(gòu)并且使用工作進(jìn)程的核心組件。IIS 5.0 隔離模式用于依賴 IIS 5.0 的特定功能和行為的應(yīng)用程序。該隔離模式由 IIs5IsolationModeEnabled 配置數(shù)據(jù)庫屬性指定。

您所選擇的 IIS 應(yīng)用程序隔離模式對(duì)性能、可靠性、安全性和功能可用性都會(huì)產(chǎn)生影響。工作進(jìn)程隔離模式是 IIS 6.0 操作的推薦模式,因?yàn)樗鼮閼?yīng)用程序提供了更可靠的平臺(tái)。工作進(jìn)程隔離模式也提供了更高級(jí)別的安全性,因?yàn)檫\(yùn)行在工作進(jìn)程中的應(yīng)用程序的默認(rèn)標(biāo)識(shí)為 NetworkService。

以 IIS 5.0 隔離模式運(yùn)行的應(yīng)用程序的默認(rèn)標(biāo)識(shí)為 LocalSystem,該標(biāo)識(shí)允許訪問并具有更改計(jì)算機(jī)上幾乎所有資源的能力。

IIS 功能 IIS 5.0隔離模式宿主/組件 工作進(jìn)程隔離模式宿主/組件
工作進(jìn)程管理 N/A Svchost.exe/WWW 服務(wù)
工作進(jìn)程 N/A W3wp.exe/工作進(jìn)程
運(yùn)行進(jìn)程內(nèi)ISAPI 擴(kuò)展 Inetinfo.exe W3wp.exe
運(yùn)行進(jìn)程外ISAPI 擴(kuò)展 DLLHost.exe N/A(所有的 ISAPI 擴(kuò)展都在進(jìn)程內(nèi))
運(yùn)行ISAPI篩選器 Inetinfo.exe W3wp.exe
HTTP.sys 配置 Svchost.exe/WWW 服務(wù) Svchost.exe/WWW 服務(wù)
HTTP 協(xié)議支持 Windows內(nèi)核/HTTP.sys Windows 內(nèi)核/HTTP.sys
IIS配置數(shù)據(jù)庫 Inetinfo.exe Inetinfo.exe
FTP Inetinfo.exe Inetinfo.exe
NNTP Inetinfo.exe Inetinfo.exe
SMTP Inetinfo.exe Inetinfo.exe

 

由此可見,我們只能使用工作進(jìn)程隔離模式解決.net的安全問題。默認(rèn)情況下,IIS 6.0在工作進(jìn)程隔離模式下運(yùn)行,如圖五所示。在這種模式中,對(duì)于每一個(gè)Web應(yīng)用,IIS 6.0都用一個(gè)獨(dú)立的w3wp.exe的實(shí)例來運(yùn)行它。w3wp.exe也稱為工作進(jìn)程(Worker Process),或W3Core

可靠性和安全性??煽啃缘奶岣呤且?yàn)橐粋€(gè)Web應(yīng)用的故障不會(huì)影響到其他Web應(yīng)用,也不會(huì)影響http.sys,每一個(gè)Web應(yīng)用由W3SVC單獨(dú)地監(jiān)視其健康狀況。安全性的提高是由于應(yīng)用程序不再象IIS 5.0和IIS 4.0的進(jìn)程內(nèi)應(yīng)用那樣用System帳戶運(yùn)行,默認(rèn)情況下,w3wp.exe的所有實(shí)例都在一個(gè)權(quán)限有限的“網(wǎng)絡(luò)服務(wù)”帳戶下運(yùn)行,如圖六所示,必要時(shí),還可以將工作進(jìn)程配置成用其他用戶帳戶運(yùn)行。

對(duì),這里,這里就是我們解決的核心。

我們把每一個(gè)網(wǎng)站都分配一個(gè)獨(dú)立的應(yīng)用程序池,并賦予不同的權(quán)限。不就能解決這個(gè)問題了嗎?

具體如何做呢,下面我就針對(duì)建立一個(gè)網(wǎng)站來做一個(gè)示范:

首先,我們?yōu)榫W(wǎng)站創(chuàng)建兩個(gè)用戶(一個(gè)是app_test_user、密碼為appuser,一個(gè)是iis_test_user、密碼為iisuser)

1. 打開 計(jì)算機(jī)管理器

2. 單擊控制臺(tái)樹中的用戶→計(jì)算機(jī)管理→系統(tǒng)工具→本地用戶和組→用戶

3. 單擊“操作”菜單上的“新用戶”輸入用戶名為。app_test_user、密碼為appuser

4. 在對(duì)話框中鍵入適當(dāng)?shù)男畔ⅰ?/p>

5. 選中復(fù)選框:

用戶不能更改密碼

密碼永不過期

6. 單擊“創(chuàng)建”,然后單擊“關(guān)閉”。

按照此方法在創(chuàng)建iis_test_user賬戶

然后分別把a(bǔ)pp_test_user添加到iis_wpg組,把iis_test_user添加到Guests組。刪除其他組。

然后,建立相應(yīng)的應(yīng)用程序池。

依次打開Internet 信息服務(wù)→本地計(jì)算機(jī)→應(yīng)用程序池→新建→應(yīng)用程序池

新建一個(gè)名字為test的應(yīng)用程序池

編輯test應(yīng)用程序池的屬性→標(biāo)示→配置→用戶名→瀏覽→把用戶名改為我們剛才建立的app_test_user并輸入相應(yīng)的密碼

其次建立相應(yīng)的網(wǎng)站。

依次打開Internet 信息服務(wù)→本地計(jì)算機(jī)→網(wǎng)站→新建→test的網(wǎng)站,目錄為d:\test →編輯test網(wǎng)站的屬性→主目錄→應(yīng)用程序池→app_test_user →目錄安全性→身份驗(yàn)證和訪問控制→編輯,選擇我們剛才建立的iis_test_user,并輸入相應(yīng)的密碼iisuser→保存并退出。

最后設(shè)定服務(wù)器的安全。

C:只給administrators和system完全控制的權(quán)利,刪除掉其他所有的權(quán)限,不替換子目錄

C:\Documents and Settings繼承父項(xiàng),并替換子目錄。

C:\Program Files繼承父項(xiàng),并替換子目錄,并把C:\Program Files\Common Files\Microsoft Shared繼承屬性刪除并復(fù)制現(xiàn)有屬性,增加users的讀取權(quán)限并替換子目錄(這樣做是為了能夠讓asp,asp.net使用access等數(shù)據(jù)庫)。

C:\windows刪除繼承,并復(fù)制現(xiàn)有屬性,只給予administrators,system完全控制和users讀取的權(quán)限并替換子目錄。

 

其余所有的盤都只給于administrators和system用戶的完全控制權(quán)限,刪除其他所有用戶并替換子目錄。

D:\test(用戶網(wǎng)站目錄)繼承現(xiàn)有屬性并增加app_test_user和iis_test_user完全控制的權(quán)限并替換子目錄。

以后每增加一個(gè)網(wǎng)站都以此類推。

但是,至此,system.io還是對(duì)c:\windows又讀取權(quán)限的,(懷疑network servers用戶屬于users組,但是好多服務(wù)都要使用users組來執(zhí)行的,所以不能把c:\windwos去掉users組的讀取權(quán)限)但必須知道系統(tǒng)路徑,有兩種方案解決。

1、 再安裝系統(tǒng)的時(shí)候使用無人值守安裝,更換c:\windows默認(rèn)安裝路徑,如更改為c:\testtest(要符合dos的命名規(guī)則,不能超過8個(gè)字符)。這個(gè)是必需的

2、 以下位置具有指派給 IIS_WPG 的權(quán)限:

%windir%\help\iishelp\common – 讀取
%windir%\IIS Temporary Compressed Files – 列出、讀取、寫入
%windir%\system32\inetsrv\ASP Compiled Template – 讀取
Inetpub\wwwroot(或內(nèi)容目錄)- 讀取、執(zhí)行

此外,IIS_WPG 還具有以下用戶權(quán)限:

忽略遍歷檢查(SeChangeNotifyPrivilege)

作為批處理作業(yè)登錄(SeBatchLogonRight)

從網(wǎng)絡(luò)訪問此計(jì)算機(jī)(SeNetworkLogonRight)

當(dāng)然兩種方法結(jié)合起來算是最安全的方案,一般使用第一種方案已經(jīng)算是很安全的,畢竟是用一個(gè)webshell來猜測(cè)8位字符的目錄還是需要花費(fèi)時(shí)間的。使用防火墻很容易就能察覺出來,并加以控制。

第二種可能根據(jù)所安裝軟件不同還要相應(yīng)增加目錄的讀取權(quán)限,詳細(xì)情況要根據(jù)軟件來確定。

如果主機(jī)用戶比較多,這將是一個(gè)相當(dāng)大的勞動(dòng)量,推薦使用程序來解決問題,下面給出網(wǎng)上不常見的針對(duì)iis應(yīng)用程序池操作的代碼和針對(duì)iis虛擬目錄的操作代碼。

操作iis應(yīng)用程序池
using System;
using System.DirectoryServices;
using System.Reflection;

namespace ADSI1
{
///
/// Small class containing methods to configure IIS.
///
class ConfigIIS
{
///
/// The main entry point for the application.
///
[STAThread]
//主程序入口,可以選擇用哪些,我為了方便,全部功能都寫上去了。
static void Main(string[] args)
{
string AppPoolName = "MyAppPool";
string newvdir1 = "MyVDir";
DirectoryEntry newvdir = CreateVDir(newvdir1);

CreateAppPool(AppPoolName);
AssignAppPool(newvdir, AppPoolName);

ConfigAppPool("Stop",AppPoolName);
}

//創(chuàng)建虛擬目錄
static DirectoryEntry CreateVDir (string vdirname)
{
DirectoryEntry newvdir;
DirectoryEntry root=new DirectoryEntry("IIS://localhost/W3SVC/1/Root");
newvdir=root.Children.Add(vdirname, "IIsWebVirtualDir");
newvdir.Properties["Path"][0]= "c:\\inetpub\\wwwroot";
newvdir.Properties["AccessScript"][0] = true;
newvdir.CommitChanges();
return newvdir;
}

//創(chuàng)建新的應(yīng)用程序池。
static void CreateAppPool(string AppPoolName)
{
DirectoryEntry newpool;
DirectoryEntry apppools=new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
newpool=apppools.Children.Add(AppPoolName, "IIsApplicationPool");
newpool.CommitChanges();
}

static void AssignAppPool(DirectoryEntry newvdir, string AppPoolName)
{
object[] param={0, AppPoolName, true};
newvdir.Invoke("AppCreate3", param);
}

//method是管理應(yīng)用程序池的方法,有三種Start、Stop、Recycle,而AppPoolName是應(yīng)用程序池名稱
static void ConfigAppPool(string method,string AppPoolName)
{
DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
DirectoryEntry findPool = appPool.Children.Find(AppPoolName,IIsApplicationPool");
findPool.Invoke(method,null);
appPool.CommitChanges();
appPool.Close();
}

//應(yīng)用程序池的列表
static void AppPoolList()
{
DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
foreach(DirectoryEntry a in appPool.Children)
{
Console.WriteLine(a.Name);
}
}

private void VDirToAppPool()
{
DirectroryEntry VD = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT/ccc");
Console.WriteLine(VD.Properties["AppPoolId"].Value.ToString());
}
}
}

 

iis6操作的例子

 

 

 

using System;
using System.DirectoryServices;
using System.Collections;
using System.Text.RegularExpressions;
using System.Text;

namespace Wuhy.ToolBox
{
/// </summary>

public class IISAdminLib
{
#region UserName,Password,HostName的定義
public static string HostName
{
get
{
return hostName;
}
set
{
hostName = value;
}
}

public static string UserName
{
get
{
return userName;
}
set
{
userName = value;
}
}

public static string Password
{
get
{
return password;
}
set
{
if(UserName.Length <= 1)
{
throw new ArgumentException("還沒有指定好用戶名。請(qǐng)先指定用戶名");
}
password = value;
}
}

public static void RemoteConfig(string hostName, string userName, string password)
{
HostName = hostName;
UserName = userName;
Password = password;
}

private static string hostName = "localhost";
private static string userName;
private static string password;
#endregion

#region 根據(jù)路徑構(gòu)造Entry的方法

/// <summary>
/// 根據(jù)是否有用戶名來判斷是否是遠(yuǎn)程服務(wù)器。
/// 然后再構(gòu)造出不同的DirectoryEntry出來
/// </summary>
/// <param name="entPath">DirectoryEntry的路徑</param>
/// <returns>返回的是DirectoryEntry實(shí)例</returns>

public static DirectoryEntry GetDirectoryEntry(string entPath)
{
DirectoryEntry ent;
if(UserName == null)
{
ent = new DirectoryEntry(entPath);
}
else
{
// ent = new DirectoryEntry(entPath, HostName+"\\"+UserName, Password, AuthenticationTypes.Secure);
ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);
}
return ent;
}

#endregion
#region 添加,刪除網(wǎng)站的方法

/// <summary>
/// 創(chuàng)建一個(gè)新的網(wǎng)站。根據(jù)傳過來的信息進(jìn)行配置
/// </summary>
/// <param name="siteInfo">存儲(chǔ)的是新網(wǎng)站的信息</param>

public static void CreateNewWebSite(NewWebSiteInfo siteInfo)
{
if(! EnsureNewSiteEnavaible(siteInfo.BindString))
{
throw new DuplicatedWebSiteException("已經(jīng)有了這樣的網(wǎng)站了。" + Environment.NewLine + siteInfo.BindString);
}
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry rootEntry = GetDirectoryEntry(entPath);
string newSiteNum = GetNewWebSiteID();
DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, "IIsWebServer");
newSiteEntry.CommitChanges();
newSiteEntry.Properties["ServerBindings"].Value = siteInfo.BindString;
newSiteEntry.Properties["ServerComment"].Value = siteInfo.CommentOfWebSite;
newSiteEntry.CommitChanges();
DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir");
vdEntry.CommitChanges();
vdEntry.Properties["Path"].Value = siteInfo.WebPath;
vdEntry.CommitChanges();
}

/// <summary>
/// 刪除一個(gè)網(wǎng)站。根據(jù)網(wǎng)站名稱刪除。
/// </summary>
/// <param name="siteName">網(wǎng)站名稱</param>

public static void DeleteWebSiteByName(string siteName)
{
string siteNum = GetWebSiteNum(siteName);
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
string rootPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry rootEntry = GetDirectoryEntry(rootPath);
rootEntry.Children.Remove(siteEntry);
rootEntry.CommitChanges();
}

#endregion
#region Start和Stop網(wǎng)站的方法

public static void StartWebSite(string siteName)
{
string siteNum = GetWebSiteNum(siteName);
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
siteEntry.Invoke("Start", new object[] {});
}

public static void StopWebSite(string siteName)
{
string siteNum = GetWebSiteNum(siteName);
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
siteEntry.Invoke("Stop", new object[] {});
}

#endregion
#region 確認(rèn)網(wǎng)站是否相同

/// <summary>
/// 確定一個(gè)新的網(wǎng)站與現(xiàn)有的網(wǎng)站沒有相同的。
/// 這樣防止將非法的數(shù)據(jù)存放到IIS里面去
/// </summary>
/// <param name="bindStr">網(wǎng)站邦定信息</param>
/// <returns>真為可以創(chuàng)建,假為不可以創(chuàng)建</returns>

public static bool EnsureNewSiteEnavaible(string bindStr)
{
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry ent = GetDirectoryEntry(entPath);
foreach(DirectoryEntry child in ent.Children)
{
if(child.SchemaClassName == "IIsWebServer")
{
if(child.Properties["ServerBindings"].Value != null)
{
if(child.Properties["ServerBindings"].Value.ToString() == bindStr)
{
return false;
}
}
}
}
return true;
}

#endregion
#region 獲取一個(gè)網(wǎng)站編號(hào)的方法
/// <summary>
/// 獲取一個(gè)網(wǎng)站的編號(hào)。根據(jù)網(wǎng)站的ServerBindings或者ServerComment來確定網(wǎng)站編號(hào)
/// </summary>
/// <param name="siteName"></param>
/// <returns>返回網(wǎng)站的編號(hào)</returns>
/// <exception cref="NotFoundWebSiteException">表示沒有找到網(wǎng)站</exception>

public static string GetWebSiteNum(string siteName)
{
Regex regex = new Regex(siteName);
string tmpStr;
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry ent = GetDirectoryEntry(entPath);
foreach(DirectoryEntry child in ent.Children)
{
if(child.SchemaClassName == "IIsWebServer")
{
if(child.Properties["ServerBindings"].Value != null)
{
tmpStr = child.Properties["ServerBindings"].Value.ToString();
if(regex.Match(tmpStr).Success)
{
return child.Name;
}
}
if(child.Properties["ServerComment"].Value != null)
{
tmpStr = child.Properties["ServerComment"].Value.ToString();
if(regex.Match(tmpStr).Success)
{
return child.Name;
}
}
}
}

throw new NotFoundWebSiteException("沒有找到我們想要的站點(diǎn)" + siteName);
}

#endregion
#region 獲取新網(wǎng)站id的方法
/// <summary>
/// 獲取網(wǎng)站系統(tǒng)里面可以使用的最小的ID。
/// 這是因?yàn)槊總€(gè)網(wǎng)站都需要有一個(gè)唯一的編號(hào),而且這個(gè)編號(hào)越小越好。
/// 這里面的算法經(jīng)過了測(cè)試是沒有問題的。
/// </summary>
/// <returns>最小的id</returns>

public static string GetNewWebSiteID()
{
ArrayList list = new ArrayList();
string tmpStr;
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry ent = GetDirectoryEntry(entPath);
foreach(DirectoryEntry child in ent.Children)
{
if(child.SchemaClassName == "IIsWebServer")
{
tmpStr = child.Name.ToString();
list.Add(Convert.ToInt32(tmpStr));
}
}
list.Sort();
int i = 1;
foreach(int j in list)
{
if(i == j)
{
i++;
}
}
return i.ToString();
}
#endregion
}

#region 新網(wǎng)站信息結(jié)構(gòu)體

public struct NewWebSiteInfo
{
private string hostIP; // The Hosts IP Address
private string portNum; // The New Web Sites Port.generally is "80"
private string descOfWebSite; // 網(wǎng)站表示。一般為網(wǎng)站的網(wǎng)站名。例如"www.dns.com.cn"
private string commentOfWebSite;// 網(wǎng)站注釋。一般也為網(wǎng)站的網(wǎng)站名。
private string webPath; // 網(wǎng)站的主目錄。例如"e:\tmp"
public NewWebSiteInfo(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath)
{
this.hostIP = hostIP;
this.portNum = portNum;
this.descOfWebSite = descOfWebSite;
this.commentOfWebSite = commentOfWebSite;
this.webPath = webPath;
}
public string BindString
{
get
{
return String.Format("{0}:{1}:{2}", hostIP, portNum, descOfWebSite);
}
}
public string CommentOfWebSite
{
get
{
return commentOfWebSite;
}
}
public string WebPath
{
get
{
return webPath;
}
}
}
#endregion
}

至此,一個(gè)相對(duì)安全的.net主機(jī)就建立起來了,隨著.net2.0的發(fā)布越來越逼近,希望ms能針對(duì)此問題作一個(gè)妥善的防范。

我們已經(jīng)簡(jiǎn)單的介紹了一下ASP.NET中關(guān)于文件IO系統(tǒng)的漏洞的防治方法,這一方法有些繁瑣,但是卻可以從根本上杜絕一些漏洞,我們討論的只是很少的一部分,更多的解決放法需要大家共同來探索、學(xué)習(xí)。

問題未解決?付費(fèi)解決問題加Q或微信 2589053300 (即Q號(hào)又微信號(hào))右上方掃一掃可加博主微信

所寫所說,是心之所感,思之所悟,行之所得;文當(dāng)無敷衍,落筆求簡(jiǎn)潔。 以所舍,求所獲;有所依,方所成!

支付寶贊助
微信贊助

免責(zé)聲明,若由于商用引起版權(quán)糾紛,一切責(zé)任均由使用者承擔(dān)。

您必須遵守我們的協(xié)議,如您下載該資源,行為將被視為對(duì)《免責(zé)聲明》全部?jī)?nèi)容的認(rèn)可->聯(lián)系老梁投訴資源
LaoLiang.Net部分資源來自互聯(lián)網(wǎng)收集,僅供用于學(xué)習(xí)和交流,請(qǐng)勿用于商業(yè)用途。如有侵權(quán)、不妥之處,請(qǐng)聯(lián)系站長(zhǎng)并出示版權(quán)證明以便刪除。 敬請(qǐng)諒解! 侵權(quán)刪帖/違法舉報(bào)/投稿等事物聯(lián)系郵箱:service@laoliang.net
意在交流學(xué)習(xí),歡迎贊賞評(píng)論,如有謬誤,請(qǐng)聯(lián)系指正;轉(zhuǎn)載請(qǐng)注明出處: » ASP.NET虛擬主機(jī)安全漏洞解決方案

發(fā)表回復(fù)

本站承接,網(wǎng)站推廣(SEM,SEO);軟件安裝與調(diào)試;服務(wù)器或網(wǎng)絡(luò)推薦及配置;APP開發(fā)與維護(hù);網(wǎng)站開發(fā)修改及維護(hù); 各財(cái)務(wù)軟件安裝調(diào)試及注冊(cè)服務(wù)(金蝶,用友,管家婆,速達(dá),星宇等);同時(shí)也有客戶管理系統(tǒng),人力資源,超市POS,醫(yī)藥管理等;

立即查看 了解詳情