程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Visual Basic .NET 和 Visual C# .NET 程序員需要解決的安全問題(二)

Visual Basic .NET 和 Visual C# .NET 程序員需要解決的安全問題(二)

編輯:關於C語言
其他資源
除了上面的概述中介紹的內容外,還有許多其他內容可供選擇。以下主題更詳細地討論了代碼訪問安全性:

Introduction to Code Access Security(英文)
Code Access Security(英文)
Security Namespaces in Visual Studio(英文)
Web 應用程序
解決 Web 應用程序的安全問題,可以保護您的服務器免受惡意代碼的攻擊,並保護數據不被破壞。您可以使用多種方法來保護服務器。

通過禁用 XML Web services 的動態發現功能來禁止用戶查找和運行您的 XML Web services。
在允許用戶訪問服務器之前,通過身份驗證來驗證用戶的標識。
通過使用 ASPNET 進程標識,可以更好地調整用戶可以使用的資源。
下面將詳細討論每一種方法。

動態發現
動態發現是 .NET 框架的一項功能,它允許 Web 浏覽器查找在服務器上運行的 XML Web services。找到 XML Web service 後,用戶就可以調用該 XML Web services 的方法。動態發現雖然為用戶提供了強大的功能,但同時也給服務器帶來潛在的安全危險。多數情況下,您不需要啟用動態發現功能。安裝 .Net 框架時,動態發現在默認情況下處於禁用狀態。這並不表示 XML Web services 不可用,而只表示服務器將不提供可用服務的目錄。客戶端仍然可以使用 XML Web services,但您需要向其提供該服務的確切位置。

警告:禁用動態發現後,您需要將 XML Web services 的位置發送給客戶端。
在部署服務器上,有兩個項可以控制 XML Web services 的發現功能。第一項(machine.config 文件)控制服務器的整體發現功能。Machine.config 文件是一個包含控制服務器上 Web 應用程序的設置的 XML 文件,它位於 \%Windows%\Microsoft.Net\Framework\Version\Config 文件夾。此文件包含一個默認情況下被注釋掉的元素。要啟用發現功能,您需要刪除這些注釋字符。還需要使用 ASPNET 帳戶來運行應用程序,如下一節“ASPNET 進程標識”中所述。

<!--<add verb="*" path="*.vsdisco"
type="System.Web.Services.Discovery.DiscoveryRequestHandler,
System.Web.Services, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>-->
第二項是一個發現文件。發現文件可以是默認的發現文件 (default.vsdisco),也可以是 XML Web services 特定的發現文件。它是一個 XML 文件,包含有關 XML Web services 文件位置的信息。

要客戶端能夠發現特定的 XML Web services,您需要在 Machine.config 文件中啟用發現功能,並創建和部署應用程序的發現文件。發現文件是一個僅列出不包含 XML Web services 的路徑的 XML 文件。下面提供了一個示例。有關創建和部署此文件的完整說明,請參閱 Deploying XML Web Services in Managed Code(英文)。

<?XML version="1.0" encoding="utf-8" ?>
<dynamicDiscovery XMLns="urn:schemas-dynamicdiscovery:disco.2000-03-17">
     <exclude path="_vti_cnf" />
     <exclude path="_vti_pvt" />
     <exclude path="_vti_log" />
     <exclude path="_vti_script" />
     <exclude path="_vti_txt" />
     <exclude path="Web References" />
</dynamicDiscovery>
如果您的部署服務器安裝有 Visual Studio .NET,則 Web 根文件夾將包含默認的發現文件 (default.vsdisco),該文件是在 Visual Studio .Net 的安裝過程中創建的。如果服務器中包含此文件並且在 Machine.config 文件中啟用了發現功能,則可以發現服務器上的所有 XML Web services。如果要禁止發現 XML Web services,則需要刪除此文件。

警告:如果部署服務器安裝了 Visual Studio .Net,則在服務器投入使用之前應該刪除 default.vsdisco 文件。
建議您不要在已安裝 Visual Studio .NET 的服務器上部署 XML Web services。Visual Studio .NET 安裝程序會將可以使用的文件和用戶都添加到您的系統上。您可以保護已安裝 Visual Studio .NET 的系統的安全,但是,如果不需要在部署服務器上安裝 Visual Studio .Net,建議您不要安裝。
有關啟用動態發現的詳細信息,請參閱 Enabling Discovery for an XML Web services(英文)和 Fine-Tuning Discovery Mechanisms(英文)。

身份驗證、模擬和委托
默認情況下,Web 應用程序將以匿名模式運行,也就是說,應用程序不需要任何有關用戶標識的信息。這對於那些包含公共信息的站點非常適用。如果要對訪問應用程序或其他資源的用戶進行控制,則需要向應用程序添加身份驗證。身份驗證是識別應用程序的用戶並驗證該用戶是否有權訪問此應用程序的過程。ASP.Net 支持多種身份驗證方法。其中最常用的方法有:

匿名   無需用戶提供任何標識信息。此方法適用於包含公共內容的 Web 站點。如果需要個性化站點,則可以使用 cookIE。有關在 ASP.Net 應用程序中使用 cookIE 的詳細信息,請參閱 Introduction to Web Forms State Management(英文)。
窗體   應用程序向用戶提供一個登錄窗體,要求用戶提供登錄信息(如姓名和密碼)。窗體將被發送回服務器,服務器將該信息與數據倉庫進行比較。
基本   基本身份驗證是使用 Internet 信息服務 (IIS) 配置的,大部分浏覽器都支持基本身份驗證。如果啟用,浏覽器將提示用戶輸入姓名和密碼,然後用 Base64 編碼(此編碼易於解密)將信息傳回 ASP.NET 應用程序。此方法要求用戶擁有 Windows 帳戶。如果在基本身份驗證之外再使用安全套接字層 (SSL),則可以確保此身份驗證方法的安全性。有關 ASP.Net 中的 SSL 支持的信息,請參閱 Using Secure Sockets Layer(英文)。
簡要   簡要身份驗證是使用 IIS 配置的,可用於運行 Microsoft Windows® 2000 或 Windows XP 的服務器。簡要身份驗證提供了比基本身份驗證更高的密碼加密級別。此方法要求用戶擁有存儲在 Microsoft Active Directory® 中的 Windows 帳戶。
集成 Windows   集成 Windows 身份驗證類似於基本身份驗證和簡要身份驗證,唯一區別是用戶的姓名和密碼不傳回 Web 應用程序。此方法尤其適用於 Intranet 環境。它要求用戶擁有 Windows 帳戶,並且只有 Internet Explorer 浏覽器支持該方法。
證書   證書是安裝在計算機中的數字密鑰。當用戶試圖訪問服務器時,需要提供此密鑰。然後服務器在域或 Active Directory 中對該證書進行驗證。此方法適用於那些需要高度安全性而不惜付出管理證書成本的應用程序。
Passport   Microsoft 提供了這種集中的身份驗證服務。Passport 身份驗證適用於以下情況:當您的 Web 站點與其他 Passport 站點一起使用時,使用戶只需登錄一次就能夠訪問所有站點;或者您不想維護用戶數據庫。
身份驗證允許您為應用程序的用戶授權,但這並不足以使用戶能夠訪問資源,例如文件和數據庫。您可以對資源進行配置,使其對特定的用戶(而不是 Web 應用程序本身)可用。在這種情況下,可以使用模擬來允許用戶訪問這些資源。使用模擬時,服務器進程以通過身份驗證的用戶標識來運行。當應用程序使用模擬並查詢數據庫時,數據庫應用程序在處理查詢時會認為查詢來自用戶,而不是服務器。如下例所示,可以通過在應用程序的 Web.config 文件中設置 identity 元素的 impersonate 屬性來啟用模擬。Web.config 文件作為每個 Web 應用程序項目的一部分而創建。

<identity impersonate="true">
比模擬更進一步的是委托,委托在訪問遠程資源(其他計算機)時使用用戶標識。如下表所示,並非所有的身份驗證方法都支持委托。

支持委托 不支持委托
基本 匿名
集成 Windows 簡要
證書 Passport
  窗體

有關選擇和實施身份驗證方法的詳細論述,請參閱 Authentication in ASP.NET:.Net Security Guidance(英文)。有關 Web 應用程序安全性的詳細信息,請參閱 Web Application Security at Run Time(英文)。

ASPNET 進程標識
當 Web 應用程序開始在服務器上運行時,它並不是像以您(Web 應用程序的作者)的身份登錄那樣運行。而是像使用服務器上定義的一個 Windows 用戶帳戶登錄那樣運行。該帳戶(也稱作標識)可以是以下三個帳戶之一:ASPNET 標識、SYSTEM 標識或自定義標識。該標識是在 Machine.config XML 文件(位於服務器的 \%Windows%\Microsoft.Net\Framework\Version\Config 文件夾中)中指定的。以下所示是該元素三種配置方法的簡化示例。文件中的元素具有若干個屬性,此示例中並未顯示出來。

<!-- 選擇 ASPNET 標識 -->
<system.web>
  <processModel enable="true" username="MacHINE" passWord="AutoGenerate"/>
</system.web>

<!-- 選擇 SYSTEM 標識 -->
<system.web>
  <processModel enable="true" username="SYSTEM" passWord="AutoGenerate"/>
</system.web>

<!-- 選擇自定義標識 -->
<system.web>
  <processModel enable="true" username="domain\user" passWord="pwd"/>
</system.web>
ASPNET 是在隨 .NET 框架安裝 Machine.config 文件時所選擇的默認標識。ASPNET 帳戶是 Users 組的成員,默認情況下,Users 組只擁有最小的權限。ASPNET 帳戶還擁有其他幾個權限,其中包括對 ASP.Net 和 Windows 臨時目錄的全部權限。

如果將標識更改為 SYSTEM,則應用程序將在 SYSTEM 標識下運行,該標識擁有 Administrators 組的權限。SYSTEM 帳戶幾乎可以訪問服務器上的所有資源。

警告:如果服務器在 SYSTEM 標識下運行,受惡意代碼攻擊和數據遭到破壞的危險非常大。
要使用自定義標識,必須創建帳戶並按特定方式配置其權限。有關創建自定義標識的詳細信息,請參閱 Authentication in ASP.NET:.Net Security Guidelines(英文)。

默認情況下,有幾種系統資源對 ASPNET 帳戶不可用。下面概要介紹了常見的限制和解決方案。建議您使用 ASPNET 帳戶和所介紹的解決方案,而不要在 SYSTEM 標識下運行應用程序。

文件資源   可以通過 Windows 資源管理器訪問各個文件和文件夾的訪問控制列表 (ACL),來調整授予 ASPNET 帳戶的文件和文件夾權限。對 ASPNET 的 ACL 的更改不會自動通過部署傳播。例如,您可能允許 ASPNET 帳戶對開發計算機上的 c:\picture.bmp 文件擁有寫入權限。當部署應用程序時,應用程序將在另一台計算機上運行,該計算機也具有 ASPNET 帳戶。您需要在部署計算機上為 ASPNET 帳戶添加對部署計算機上 c:\picture.bmp 文件的寫入權限。幸運的是,您可以在部署項目中使用自定義操作對 ACL 進行更改,但必須對所要做的更改進行跟蹤。
事件日志   ASPNET 帳戶可以向現有日志添加條目,但不能創建新的事件日志類別。這時您可以在使用 ASPNET 帳戶時啟用模擬,以便創建新的事件日志類別。模擬標識必須具有足夠的權限才能創建事件日志類別。如果應用程序需要的事件日志可以在投入使用前指定,則可以由部署項目來創建這些日志。
目錄服務和 Active Directory   要對它們進行訪問,需要使用模擬和委托,或者將特定的安全憑據傳遞給 DirectoryEntry 對象。如果選擇將特定安全憑據傳遞給 DirectoryEntry 對象,則需要確保已正確存儲此信息。
性能計數器   ASPNET 帳戶只能寫入而不能讀取性能計數器,並且不能創建新的性能計數器類別。這時您可以在使用 ASPNET 帳戶時啟用模擬,以便創建新的性能計數器類別。模擬標識必須具有足夠的權限才能創建性能計數器類別。如果應用程序需要的性能計數器可以在投入使用前指定,則可以由部署項目來創建這些性能計數器。
在 ASPNET 標識下運行時保護文件資源的安全
注意:本節中的說明適用於運行 NTFS 文件系統的系統。如果您的服務器運行的是 FAT32 文件系統,請參閱文件系統說明文件,了解有關保護文件安全的信息。
默認情況下,ASPNET 帳戶只擁有 Users 組的讀取和執行權限。如果 Web 應用程序需要寫入或創建新文件,則可以通過修改訪問控制列表 (ACL) 為特定文件和文件夾授權。要訪問某個文件的 ACL,可以在 Windows 資源管理器中右擊該文件,然後依次選擇“屬性”和“安全”選項卡。最好是修改特定文件的 ACL,而不是向 ASPNET 帳戶添加通用權限。最常使用的權限包括:

讀取 - 數據文件和可執行文件需要讀取權限。
寫入 - 由應用程序更新的數據文件需要寫入權限。
執行 - 在 Web 應用程序中,.asmx 文件為可執行文件。
創建 - 要創建文件,需要為要在其中創建文件的文件夾添加創建權限。
這些權限適用於:

文件
文件夾
警告:應避免允許對同一文件或目錄同時擁有執行權限和寫入或創建權限。在這種情況下,用戶可能會設法在文件中寫入惡意代碼,然後再執行。
以下是有關簡化授權過程的一些技巧:

根據應用程序中文件所需的權限,將文件分別放入不同的目錄。例如,如果在一個目錄中只存放讀取/執行文件,則只需要為一個目錄設置這些權限,而不必單獨為每個文件設置權限。請考慮在應用程序中為讀取/執行、讀取/寫入和讀取/創建權限分別創建目錄。
應用程序可以包含在部署時為空的數據文件,還可以包含首次運行應用程序時創建文件所需的代碼。這需要為目錄添加創建權限,這是一種較高的安全設置。為了避免添加代碼來創建新的空文件,請考慮在部署時即給應用程序提供一個空文件。這樣,您只需給該文件添加寫入權限,而不必給目錄添加創建權限。
在開發應用程序時,您將為開發計算機上的文件和目錄添加權限,以便精確調整應用程序的安全級別。不幸的是,ACL 不會被傳遞到部署計算機上的相應文件。要規劃傳遞這些 ACL,請記住以下幾點:

可以在部署程序包中使用自定義操作來更改 ACL。有關詳細信息,請參閱 Custom Actions(英文)。
可以使用第三方工具來跟蹤和查找所做的更改。
可能需要同系統管理員確認每一個設置。您需要記錄進行更改的原因,以及為什麼必須通過更改設置來達到目的。
使用 ASPNET 標識進行調試
調試 XML Web services 時,如果在 Machine.config 文件中定義了 ASPNET 標識,將使用該標識來調用此 XML Web services。默認情況下,ASPNET 標識不是 Debugger Users 組的成員(請參見下一節“Visual Studio .Net 開發環境中的安全機制”),因此不能在調試過程中訪問 XML Web services 代碼。要調試 XML Web services,請打開 XML Web services 的代碼並設置一個斷點。

建議您在測試計算機(而不是部署計算機)上進行調試。這將在下一節“Visual Studio .Net 開發環境中的安全機制”中討論。

有關配置進程標識的詳細信息,請參閱 ASP.NET Process Identity(英文)和 ASP.Net Impersonation(英文)。

Visual Studio .Net 開發環境中的安全機制
除了保護服務器的安全外,還要保護開發計算機免受惡意代碼的攻擊和數據破壞。您可以利用開發環境中的多種機制來保護開發服務器的安全:

VS Developers 和 Debuggers   安裝 Visual Studio .Net 時將添加這兩個帳戶組。VS Developers 組具有在服務器上創建和開發 Web 應用程序的必要文件、共享和 IIS 權限。Debuggers 組可以在特定計算機(本地或遠程)上調試進程。這兩個組都是服務器上具有很大權限的用戶,可以訪問大多數資源。有關詳細信息,請參閱 Web Application Security at Design Time in Visual Studio(英文)。

調試   建議您在測試計算機(而不是部署計算機)上進行調試。如果必須在部署服務器上調試,請僅安裝遠程調試組件,並在完成調試後卸載該組件。請在脫機狀態下調試服務器。有關詳細信息,請參閱 Introduction to Web Application Debugging(英文)。

部署   對於大多數應用程序,只需要在服務器上安裝 .NET 框架就足夠了。如果在部署計算機上安裝了 Visual Studio .NET 或 Visual Studio .Net 服務器組件,則 VS Developers 組和 Debuggers 組都將出現在部署計算機上。您需要對 VS Developers 的成員和 Debugger 用戶加以限制。此外,可能還需要禁用動態發現。

警告:強烈建議您不要在部署服務器上安裝 Visual Studio。
Visual Studio .Net 的“復制項目”功能包括使用配置文件 (Web.config) 部署應用程序的選項,該配置文件不同於開發中所使用的配置文件。開發文件可能啟用了調試,在部署後,將允許用戶在引發異常時檢查調用堆棧。建議您使用不允許調試的配置文件進行部署。

總結
保護資源的安全是一個涉及多種技術和整個開發周期的過程。通過對應用程序進行周密的設計、實現、測試和部署,您可以創建非常安全的應用程序。可以使用由 ASP.Net、操作系統和 Web 浏覽器提供的安全技術來保護應用程序的安全。
  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved