ASP.NET入門帖--[老鳥勿入] - 經典論壇 (1)

由於工作太忙,好久沒有露面了.看到經典問asp.net的帖越來越多了,估計大家有這個需求,在這裡同時紀念1000帖,發個.net入門常見問題的帖子(大多摘自MSDN),減少大家學習的彎路。=======================================.NET Framework 系統要求操作系統要求下列平台支持 .NET Framework。方案 操作系統 客戶端 Microsoft&reg; Windows&reg; 98 Microsoft&reg; Windows&reg; 98 Second EditionMicrosoft&reg; Windows&reg; Millennium Edition帶有 Service Pack 6.0a 或更高版本的 Microsoft&reg; Windows NT&reg; 4.0 Workstation帶有 Service Pack 6.0a 或更高版本的 Microsoft&reg; Windows NT&reg; 4.0 ServerMicrosoft&reg; Windows&reg; 2000 ProfessionalMicrosoft&reg; Windows&reg; 2000 ServerMicrosoft&reg; Windows&reg; 2000 Advanced ServerMicrosoft&reg; Windows&reg; 2000 Datacenter ServerMicrosoft&reg; Windows&reg; XP Home EditionMicrosoft&reg; Windows&reg; XP ProfessionalMicrosoft&reg; Windows&reg; Server 2003 系列注意 在所有這些系統上,還要求有 Microsoft&reg; Internet Explorer 5.01 或更高版本以及 Microsoft&reg; Windows&reg; Installer 2.0 或更高版本。 伺服器 帶有 Service Pack 2.0 的 Microsoft&reg; Windows&reg; 2000 Professional 帶有 Service Pack 2.0 的 Microsoft&reg; Windows&reg; 2000 Server帶有 Service Pack 2.0 的 Microsoft&reg; Windows&reg; 2000 Advanced Server帶有 Service Pack 2.0 的 Microsoft&reg; Windows&reg; 2000 Datacenter ServerMicrosoft&reg; Windows&reg; XP ProfessionalMicrosoft&reg; Windows&reg; Server 2003 系列附加軟體要求若要使用附加功能,如 ASP.NET、COM+ 服務和 SQL Server .NET 數據提供程序,需要下列附加軟體。方案 功能 所需軟體 客戶端 SQL Server .NET 數據提供程序 Microsoft 數據訪問組件 (MDAC) 2.6 或更高版本 對系統管理信息的訪問 Windows Management Instrumentation (WMI)(在 Windows 2000、Windows Millennium Edition 和 Windows XP 上隨操作系統一起安裝) COM+ 服務 Windows 2000 Service Pack 2.0 伺服器 SQL Server .NET 數據提供程序 Microsoft 數據訪問組件 (MDAC) 2.7 ASP.NET Microsoft Internet 信息服務 (IIS) 5.0 硬體要求方案 所需處理器 推薦的處理器 所需 RAM 推薦的 RAM 客戶端(Windows 窗體和 Windows 服務) Pentium 90 MHz* Pentium 90 MHz 或更快 32 MB* 96 MB 或更高 伺服器 Pentium 133 MHz* Pentium 133 MHz 或更快 128 MB* 256 MB 或更高 *或者操作系統所需的最低要求(二者之中取較高者)。默認情況下,在已經安裝了 .NET Framework 的計算機上安裝新的 .NET Framework 時,所有的 ASP.NET 應用程序都會自動更新以使用新安裝的 .NET Framework 版本。唯一的例外是那些綁定到不兼容的運行庫版本或更新的運行庫版本的應用程序。儘管更高版本的 .NET Framework 具有向後兼容性,您仍可能需要相應地配置 ASP.NET 應用程序以使用某種舊版本。以下各節描述了針對 .NET Framework 的特定版本配置 ASP.NET 應用程序的過程。查看 ASP.NET 應用程序的腳本映射在管理安裝了多個版本的 .NET Framework 的計算機時,查看 ASP.NET 應用程序的腳本映射,以確定應用程序所使用的版本,這樣做通常很有用。可以使用 Internet 信息服務管理控制台查看 ASP.NET 應用程序的腳本映射。查看 ASP.NET 應用程序的腳本映射 打開 IIS 管理控制台,單擊加號展開本地計算機,然後定位到包含 ASP.NET 應用程序的文件夾。 右擊文件夾,再單擊「屬性」。出現應用程序的「屬性」對話框。 單擊「目錄」選項卡中的「配置」按鈕。出現「應用程序配置」對話框。 在「映射」選項卡中,選擇 ASP.NET 應用程序擴展名,如 .asmx 或 .aspx。 對話框的「可執行文件路徑」列列出了到應用程序所使用的 ASP.NET ISAPI 版本的路徑。默認情況下,ASP.NET ISAPI 被安裝在以下位置: 系統根Microsoft.NETFramework版本號 路徑中顯示的版本號說明了應用程序所使用的 ASP.NET ISAPI 的版本號。ASP.NET ISAPI 版本確定了應用程序所使用的運行庫版本。 使用 Aspnet_regiis.exe 更新腳本映射為使重新配置 ASP.NET 應用程序的腳本映射更容易,每個 .NET Framework 安裝都提供了一個關聯的 ASP.NET IIS 註冊工具 (Aspnet_regiis.exe) 版本。管理員可以使用此工具將 ASP.NET 應用程序重新映射到與此工具關聯的 ASP.NET ISAPI 版本。注意 因為 Aspnet_regiis.exe 鏈接到特定版本的 .NET Framework,管理員必須使用適當版本的 Aspnet_regiis.exe,以針對 ASP.NET 應用程序重新配置腳本映射。Aspnet_regiis.exe 僅將 ASP.NET 應用程序的腳本映射重新配置為與此工具關聯的 ASP.NET ISAPI 版本。此工具也可用來顯示所有已安裝的 ASP.NET 版本的狀態、註冊關聯的 ASP.NET 版本、創建客戶端腳本目錄以及執行其他配置操作。使用 Aspnet_regiis.exe 更新某一 ASP.NET 應用程序的腳本映射 1 打開命令窗口。(單擊「開始」,單擊「運行」,鍵入「cmd」,然後單擊「確定」。) 2 定位到要使用的 Aspnet_regiis.exe 版本的目錄。記住每一版本的 .NET Framework 都有自己的版本。文件通常位於以下目錄: 系統根Microsoft.NETFramework版本號 3 與到應用程序的路徑一起使用 Aspnet_regiis.exe 的 -s 或 -sn 選項,以設置腳本映射。以下顯示了一個命令行示例,它更新一個名為 SampleApp1 的應用程序的腳本映射。 Aspnet_regiis.exe -s W3SVC/1/ROOT/SampleApp1禁用腳本映射自動更新為防止將全部現有應用程序自動重新映射到正在安裝的 .NET Framework 版本,請在運行 Dotnetfx.exe 安裝程序時使用 /noaspupgrade 命令行選項。以下顯示了整個命令行。Dotnetfx.exe /c:"install /noaspupgrade"卸載某一版本的 ASP.NET如果您在一台計算機上安裝了多個版本的 ASP.NET,您可以單獨卸載某一版本。卸載 ASP.NET 通常採用的方式是:通過「控制面板」中的「添加或刪除程序」項卸載 .NET Framework。在卸載過程中,安裝程序使用 -u 選項(卸載標誌)來調用 ASP.NET IIS 註冊工具 (Aspnet_regiis.exe)。注意 如果只是希望卸載某一版本的 ASP.NET,而不卸載關聯的 .NET Framework,可以直接使用 Aspnet_regiis.exe。.NET Framework 的每一份安裝都包含該工具的關聯版本。如果只卸載 ASP.NET,請使用與要卸載的 ASP.NET 版本相關聯的工具版本的 -u 選項。有關更多信息,請參見 ASP.NET IIS 註冊工具 (Aspnet_regiis.exe)。Aspnet_regiis.exe 的 -u 選項執行以下操作: 當前映射到要卸載的 ASP.NET 版本的所有 ASP.NET 應用程序將被重新映射到計算機上的次最新兼容版本。如果不存在相兼容版本,該應用程序的腳本映射將被完全刪除。 警告 刪除腳本映射後,IIS 將以文本形式提交 ASP.NET 頁。這有可能會將源代碼公開給客戶端。ASP.NET 狀態服務為 ASP.NET 的所有兼容版本所共享,並且總是映射到安裝的最新版本的 ASP.NET。如果您要卸載的 ASP.NET 版本正是當前的最新版本,計算機上的下一個兼容的最高版本就會被註冊,以取代這一版本。如果不存在兼容版本,ASP.NET 狀態服務將被卸載。 特定於要卸載的版本的性能對象及關聯的性能計數器將被刪除。適用於所安裝的所有 ASP.NET、ASP.NET 和 ASP.NET 應用程序版本的一般性性能對象和計數器將定向到計算機上剩下的最新安裝版本。 ASPNET 用戶帳戶為 ASP.NET 的所有兼容版本所共享。如果計算機上已不存在其他的 ASP.NET 安裝,ASPNET 用戶帳戶以及關聯的訪問控制列表將被刪除。 ASP.NET 應用程序的腳本映射如果在同一計算機上安裝了多個版本的 .NET Framework,則這些安裝各包含一個關聯的 ASP.NET ISAPI 版本。ASP.NET 應用程序使用 ASP.NET ISAPI 確定該應用程序使用哪一版本的 .NET Framework。ASP.NET 應用程序可以配置為使用所安裝的 ASP.NET ISAPI 的任一版本。若要指定 ASP.NET 應用程序所使用的 ASP.NET ISAPI 版本,應在 Internet 信息服務 (IIS) 中為該應用程序註冊腳本映射。腳本映射將文件擴展名和 HTTP 謂詞與適當的 ISAPI 相關聯,以便實現腳本處理。例如,如果 IIS 接收到對某一 .aspx 文件的請求,該應用程序的腳本映射就會指示 IIS 將所請求的文件發送給適當版本的 ASP.NET ISAPI 來處理。每一 ASP.NET 應用程序的腳本映射通常是在 Internet 信息服務管理控制台中設置的,可以直接應用到某一應用程序,也可以從父應用程序繼承。默認情況下,安裝了 .NET Framework 之後,會自動更新計算機上所有現有 ASP.NET 應用程序的腳本映射以使用與這一安裝相關聯的 ASP.NET ISAPI 版本,除非應用程序使用更高的版本或者不兼容的版本。為使重新配置 ASP.NET 應用程序的腳本映射更容易,每個 .NET Framework 安裝都提供了一個關聯的 ASP.NET IIS 註冊工具 (Aspnet_regiis.exe) 版本。默認情況下,該工具安裝在以下目錄:<系統根>Microsoft.NETFramework〈版本號〉管理員可以使用此工具將 ASP.NET 應用程序重新映射到與此工具關聯的 ASP.NET ISAPI 版本。注意 因為 Aspnet_regiis.exe 與特定版本的 .NET Framework 相關聯,管理員必須使用適當版本的 Aspnet_regiis.exe,為 ASP.NET 應用程序重新配置腳本映射。Aspnet_regiis.exe 僅將 ASP.NET 應用程序的腳本映射重新配置為與此工具關聯的 ASP.NET ISAPI 版本。此工具也可用來顯示所有已安裝的 ASP.NET 版本的狀態、註冊關聯的 ASP.NET 版本、創建客戶端腳本目錄以及執行其他配置操作。在 Windows Server 2003 系列產品上,在 IIS 管理器中啟用 ASP.NET使用「配置您的伺服器嚮導」,在運行 Windows Server 2003 的伺服器上安裝 ASP.NET 在任務欄上,單擊「開始」按鈕,然後單擊「管理您的伺服器」,在「管理您的伺服器」窗口中單擊「添加或移除角色」。 在「配置您的伺服器嚮導」中,單擊「下一步」,在「伺服器角色」對話框中選中「應用程序伺服器 (IIS, ASP.NET)」,然後單擊「下一步」。 在「應用程序伺服器選項」對話框中,單擊「啟用 ASP.NET」複選框,單擊「下一步」,再單擊「下一步」。 如有必要,在 CD-ROM 驅動器中插入 Windows Server 2003 安裝 CD,然後單擊「下一步」。 安裝完成後,單擊「完成」。 使用「添加/刪除程序」對話框,在運行 Windows Server 2003 的伺服器上安裝 ASP.NET 在任務欄上,單擊「開始」按鈕,指向「控制面板」,然後單擊「添加或刪除程序」。 在「添加/刪除程序」對話框中,單擊「添加/刪除 Windows 組件」。 在「Windows 組件嚮導」的「組件」框中,單擊「應用程序伺服器」複選框,然後單擊「下一步」。 當「Windows 組件嚮導」配置完 Windows Server 2003 後,單擊「完成」。 在 Windows Server 2003 系列產品上,在 IIS 管理器中啟用 ASP.NET 在任務欄上單擊「開始」按鈕,然後單擊「運行」。 在「運行」對話框的「打開」框中,輸入「inetmgr」,然後單擊「確定」。 在「IIS 管理器」中,展開「本地計算機」,然後單擊「Web 服務擴展」。 在右窗格中,右擊「ASP.NET」,然後單擊「允許」。ASP.NET 的狀態隨即更改為「允許」。 當在運行 Windows XP Professional 或 Windows 2000 Server 的計算機上安裝 Visual Studio .NET 時,.NET Framework 和 ASP.NET 也會自動安裝。如果要單獨安裝 ASP.NET 和 .NET Framework,可以從網上下載它們並安裝到您的伺服器上。下面的過程提供了具體的步驟。在運行 Windows XP Professional 或 Windows 2000 Server 的計算機上下載和安裝 ASP.NET 如有必要,安裝並啟動 IIS。有關安裝說明,請參見操作系統的文檔。 在 msdn.microsoft.com/downloads/default.asp 上,展開「Software Development Kits」(軟體開發工具包),單擊「Microsoft .NET Framework SDK」,然後閱讀頁面上有關下載 SDK 的要求、說明和選項。 單擊所需的下載選項,閱讀最終用戶許可協議,然後單擊「Yes」(是)。 在「文件下載」對話框中,選擇保存下載文件,選擇要將安裝程序和自述文件下載到的文件夾,然後單擊「保存」。 查看自述文件中任何最新的說明。 在下載文件所在的文件夾中,雙擊 .NET Framework 安裝程序 Setup.exe。 如果您已經安裝並啟用了 IIS,安裝了 ASP.NET 和 .NET Framework,部署了應用程序並請求了一個頁,但是收到以下錯誤信息之一,這說明還沒有為 Web 站點或虛擬目錄設置適當的許可權: 對「C:InetpubWwwroot」目錄的訪問被拒絕。未能開始監視目錄更改。 伺服器無法訪問應用程序目錄「C:InetpubWwwroot<虛擬目錄名>」。該目錄不存在或者因安全設置而無法訪問。 在根 Web 站點或任何虛擬目錄上,ASP.NET 需要 ASPNET 帳戶(Aspnet_wp.exe 進程帳戶)的讀取、執行和列出許可權。必須有這些設置,ASP.NET 才能訪問內容文件和監視文件更改。請執行下面的步驟更正此問題。在根 Web 站點或虛擬目錄上添加 ASPNET 帳戶的讀取、執行和列出許可權 在 Windows 資源管理器中,瀏覽到包含根 Web 站點(默認設置為:C:InetpubWwwroot)或虛擬目錄的文件夾。 右擊該文件夾,然後單擊「屬性」。 在「安全」選項卡上,單擊「添加」。 輸入 ComputerName ASPNET(例如,在名為 Webdev 的計算機上輸入 WebdevASPNET),然後單擊「確定」。 允許 ASPNET 帳戶的下列許可權:讀取並執行、列出文件夾內容、讀取。 單擊「確定」關閉「屬性」對話框並保存更改。 注意 如果「Everyone」(每個人)組或「用戶」組能夠讀取根 Web 站點或虛擬目錄,則不需要執行這些步驟。使用 IIS 創建 ASP.NET Web 應用程序根目錄本演練步驟向您說明如何使用 Internet 信息服務 (IIS) 將某個目錄標記為應用程序根目錄。此演練說明如何創建虛擬目錄並將 C:InetpubWwwroot 目錄設置為應用程序的根目錄。準備此次演練 創建一個新目錄。此演練使用 C:myWebApp 目錄。 接下來,為 IIS 打開 Microsoft 管理控制台 (MMC),並使用下列過程之一創建一個虛擬目錄。使用 Windows Server 2003 系列產品創建虛擬目錄 單擊「開始」,指向「管理工具」,然後單擊「Internet 信息服務」。 展開「本地計算機」節點(這可能由您的計算機名稱表示),展開「網站」,然後單擊「默認網站」。 在「操作」菜單上單擊「新建」,然後單擊「虛擬目錄」。 在「虛擬目錄創建嚮導」中,單擊「下一步」。 在「別名」文本框中輸入您的應用程序名稱,然後單擊「下一步」。 輸入為準備此演練而創建的物理目錄 C:myWebApp,然後單擊「下一步」。 在「訪問許可權」頁中,選中您的應用程序所需的訪問許可權,然後單擊「下一步」。 單擊「完成」。 使用 Windows XP 創建虛擬目錄 單擊「開始」,然後單擊「控制面板」。 如果尚未完成以上操作,單擊「切換到傳統型視圖」。 雙擊「管理工具」,然後單擊「Internet 信息服務」。 展開「本地計算機」節點(這可能由您的計算機名稱表示),展開「Web 站點」,然後單擊「默認 Web 站點」。 在「操作」菜單上單擊「新建」,然後單擊「虛擬目錄」。 在「虛擬目錄創建嚮導」中,單擊「下一步」。 在「別名」文本框中輸入您的應用程序名稱,然後單擊「下一步」。 輸入為準備此演練而創建的物理目錄 C:myWebApp,然後單擊「下一步」。 在「訪問許可權」頁中,選中您的應用程序所需的訪問許可權,然後單擊「下一步」。 單擊「完成」。 使用 Windows 2000 創建虛擬目錄 單擊「開始」,指向「程序」,指向「管理工具」,然後單擊「Internet 服務管理器」。 展開「本地計算機」節點(這可能由您的計算機名稱表示),展開「Web 站點」,然後單擊「默認 Web 站點」。 在「操作」菜單上單擊「新建」,然後單擊「虛擬目錄」。 在「虛擬目錄創建嚮導」中,單擊「下一步」。 在「別名」文本框中輸入您的應用程序名稱,然後單擊「下一步」。 輸入為準備此演練而創建的物理目錄 C:myWebApp,然後單擊「下一步」。 在「訪問許可權」頁中,選中您的應用程序所需的訪問許可權,然後單擊「下一步」。 單擊「完成」。 也可以在 InetpubWwwroot 中的現有目錄下創建應用程序根目錄。為準備此演練,請在目錄 C:InetpubWwwroot 下創建一個目錄。如前所述,將其命名為 myWebApp。使用 IIS 將 InetpubWwwroot 中的現有目錄標記為 Web 應用程序 將 MMC 打開到「默認 Web 站點」,過程同前。 在「默認 Web 站點」中,單擊要指定為應用程序根目錄的子目錄。在本例中,為 myWebApp。 右擊要作為應用程序根目錄的目錄,然後單擊「屬性」。 在「虛擬目錄」選項卡的「應用程序設置」節中,單擊「創建」。 在「應用程序名」文本框中,輸入應用程序的名稱,然後單擊「確定」。ASP.NET 配置文件相關可擴展的基礎結構是 ASP.NET 配置系統的一大特色,該基礎結構使您可以在最初部署 ASP.NET 應用程序時定義配置設置,以便可以隨時添加或修改這些配置設置,同時對運作著的 Web 應用程序和伺服器產生的影響也將被減至最小。ASP.NET 配置系統提供以下好處: 配置信息存儲在基於 XML 的文本文件中。您可以使用任何標準的文本編輯器或 XML 分析器來創建和編輯 ASP.NET 配置文件。 多個配置文件(名稱都是 Web.config)可以出現在 ASP.NET Web 應用程序伺服器上的多個目錄中。每個 Web.config 文件都將配置設置應用於它自己的目錄和它下面的所有子目錄。子目錄中的配置文件可以提供除從父目錄繼承的配置信息以外的配置信息,子目錄配置設置可以重寫或修改父目錄中定義的設置。名為 systemrootMicrosoft.NETFrameworkversionNumberCONFIGMachine.config 的根配置文件提供整個 Web 伺服器的 ASP.NET 配置設置。 在運行時,ASP.NET 使用分層虛擬目錄結構中 Web.config 文件提供的配置信息為每個唯一的 URL 資源計算一組配置設置。然後緩存結果配置設置,以供所有後面的對資源的請求使用。請注意,繼承是由傳入請求路徑 (URL) 定義的,而不是到磁碟上資源的文件系統路徑(物理路徑)定義的。 ASP.NET 檢測對配置文件的更改並自動將新配置設置應用於受該更改影響的 Web 資源。不需要重新啟動伺服器讓更改生效。只要層次結構中的配置文件被更改,就將自動重新計算並重新緩存分層配置設置。<processModel> 節例外。 ASP.NET 配置系統是可以擴展的。您可以定義新配置參數並編寫配置節處理程序以對它們進行處理。 ASP.NET 通過配置 Internet 信息服務 (IIS) 防止對配置文件的直接瀏覽器訪問來保護配置文件不受外部訪問。向任何試圖直接請求配置文件的瀏覽器返回 HTTP 訪問錯誤 403(禁止)。 ASP.NET 資源的配置信息包含在一組配置文件中,每個文件都名為 Web.config。每個配置文件都包含 XML 標記和子標記的嵌套層次結構,這些標記帶有指定配置設置的屬性。因為這些標記必須是格式正確的 XML,所以標記、子標記和屬性是區分大小寫的。標記名和屬性名是 Camel 大小寫形式的,這意味著標記名的第一個字元是小寫的,任何後面連接單詞的第一個字母是大寫的。屬性值是 Pascal 大小寫形式的,這意味著第一個字元是大寫的,任何後面連接單詞的第一個字母也是大寫的。true 和 false 例外,它們總是小寫的。所有配置信息都駐留在 <configuration> 和 </configuration> 根 XML 標記之間。標記間的配置信息分為兩個主區域:配置節處理程序聲明區域和配置節設置區域。配置節處理程序聲明出現在配置文件頂部 <configSections> 和 </configSections> 標記之間。包含在 <section> 標記中的每個聲明都指定提供特定配置數據集的節的名稱和處理該節中配置數據的 .NET Framework 類的名稱。配置節設置區域位於 <configSections> 區域之後,它包含實際的配置設置。<configSections> 區域中的每個聲明都有一個配置節。每個配置節都包含子標記,這些子標記帶有包含該節設置的屬性。下面的 Web.config 文件示例聲明兩個配置 <section> 處理程序。一個管理應用程序設置,另一個管理會話狀態。<configuration><configSections><section name="appSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <section name="sessionState" type="System.Web.SessionState.SessionStateSectionHandler, System.Web, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineToApplication"/></configSections><appSettings><add key="dsn" value="localhost;uid=MyUserName;pwd=;"/><add key="msmqserver" value="servermyqueue"/></appSettings><sessionState cookieless="true" timeout="10"/></configuration>您只需要聲明配置節處理程序一次。您可以將其放置在伺服器的根 Machine.config 文件中或包含 Web 應用程序文件的虛擬目錄的 Web.config 文件中。子目錄中的配置文件自動繼承父目錄中聲明的配置處理程序。有關更多信息,請參見配置繼承。配置設置在節分組標記下經常嵌套在一起。這些頂級節標記通常表示配置設置應用到的命名空間。例如,頂級 <system.net> 標記表示網路類的設置,<system.web> 標記表示 ASP.NET 類的設置。配置 <location> 設置通過使用具有適當的 path 屬性的 <location> 標記,可以將配置設置應用於特定的資源。path 屬性可用於標識對其應用唯一配置設置的特定的文件或子目錄。例如,下面的配置文件在三個級別指定設置: 應用於當前目錄和所有子目錄的設置(全部內容包含在頂部 <configuration> 標記中)。 應用於 Sub1 子目錄的設置(全部內容包含在 <location> 標記中,路徑屬性設置為 Sub1)。 應用於 Sub2 子目錄的設置(全部內容包含在 <location> 標記中,路徑屬性設置為 Sub2)。 <configuration><system.web> <sessionState cookieless="true" timeout="10"/></system.web><!— Configuration for the "Sub1" subdirectory. --><location path="sub1"><system.web><httpHandlers><add verb="*" path="Sub1.Scott" type="Sub1.Scott"/><add verb="*" path="Sub1.David" type="Sub1.David"/></httpHandlers></system.web></location><!— Configuration for the "Sub2" subdirectory. --><location path="sub2"><system.web><httpHandlers><add verb="*" path="Sub2.Scott" type="Sub2.Scott"/><add verb="*" path="Sub2.David" type="Sub2.David"/></httpHandlers></system.web></location></configuration>訪問 ASP.NET 配置設置您可以從 ASP.NET 應用程序使用 ASP.NET 公開的內部靜態方法來訪問公共配置設置。例如,若要讀取 <sessionState> 節 cookieless 屬性的值,您可以使用下面的代碼行。[Visual Basic]Dim nocookies As Boolean = Session.IsCookieless[C#]bool nocookies = Session.IsCookieless;可以使用 ConfigurationSettings.AppSettings 靜態字元串集合來訪問 Web.config 文件頂級 <appSettings> 節中存儲的應用程序特定的設置。例如:[Visual Basic]Dim dsn As String = ConfigurationSettings.AppSettings("dsn")[C#]String dsn = ConfigurationSettings.AppSettings["dsn"];創建新的配置節您可以用自己的 XML 配置標記擴展標準的 ASP.NET 配置設置集。若要完成該操作,您必須創建自己的配置節處理程序。該處理程序必須是一個實現 IConfigurationSectionHandler 介面的 .NET Framework 類。節處理程序解釋並處理 Web.config 文件特定部分中 XML 標記中定義的設置並根據配置設置返回適當的配置對象。處理程序類返回的配置對象可以是任何數據結構;它不限於任何基配置類或配置格式。下面的示例定義 IConfigurationSectionHandler 介面。[Visual Basic]Namespace System.Web.Configuration Public Interface IConfigurationSectionHandler Function Create(parent As Object, input As Object, _node As XmlNode) As ObjectEnd InterfaceEnd Namespace[C#]namespace System.Web.Configuration {public interface IConfigurationSectionHandler {public Object Create(Object parent, Object input, XmlNode node);}}您還可以定義自己的節,該節與 <appSettings> 節使用相同的配置處理程序。例如:<configuration><configSections><sectionGroup name="myGroup"><sectionGroup name="nestedGroup"><section name="mySection" type="System.Configuration.NameValueSectionHandler,System"/></sectionGroup></sectionGroup></configSections><myGroup><nestedGroup><mySection><add key="key_one" value="1"/><add key="key_two" value="2"/></mySection></nestedGroup></myGroup></configuration>您可以讀取上面的示例中定義的新配置節的值,如下:[Visual Basic]Dim config As NameValueCollection = ConfigurationSettings.GetConfig("myGroup/nestedGroup/mySection")Response.Write("The value of key_one is " & config("key_one") & "<br>")Response.Write("The value of key_two is " & config("key_two") & "<br>")[C#]NameValueCollection config = (NameValueCollection)ConfigurationSettings.GetConfig("myGroup/nestedGroup/mySection");Response.Write("The value of key_one is " + config["key_one"] + "<br>");Response.Write("The value of key_two is " + config["key_two"] + "<br>");部署 ASP.NET Web 應用程序部署 ASP.NET 應用程序非常簡單。只需將所創建的應用程序文件從開發計算機複製到將承載應用程序的成品 Web 伺服器。可以使用 XCOPY 命令行工具或喜歡的 FTP 應用程序,將文件從一個位置複製到另一個位置。要部署希望在 Web 應用程序間共享的程序集(比如包含自定義 ASP.NET 伺服器控制項的程序集),應將其部署到全局程序集緩存。全局程序集緩存我在這裡簡單介紹一下:

安裝有公共語言運行庫的每台計算機都具有稱為全局程序集緩存的計算機範圍內的代碼緩存。全局程序集緩存中存儲了專門指定給由計算機中若干應用程序共享的程序集。應當僅在需要時才將程序集安裝到全局程序集緩存中以進行共享。一般原則是:程序集依賴項保持專用,並在應用程序目錄中定位程序集,除非明確要求共享程序集。另外,不必為了使 COM interop 或非託管代碼可以訪問程序集而將程序集安裝到全局程序集緩存。注意 在有些情況下,您顯然不希望將程序集安裝到全局程序集緩存中。如果您將組成應用程序的某個程序集置於全局程序集緩存中,則將不再能夠通過使用 xcopy 命令複製應用程序目錄來複制或安裝該應用程序。您還必須在全局程序集緩存中移動該程序集。有若干方法可以將程序集部署到全局程序集緩存中:使用專用於全局程序集緩存的安裝程序。該方法是將程序集安裝到全局程序集緩存的首選方法。使用 .NET Framework SDK 所提供的名為全局程序集緩存工具 (Gacutil.exe) 全局程序集緩存工具使您可以查看和操作全局程序集緩存和下載緩存的內容。gacutil [options] [assemblyName | assemblyPath | assemblyListFile]的開發人員工具。使用 Windows 資源管理器將程序集拖到緩存中。

從命令行部署 ASP.NET 應用程序 單擊「開始」,然後單擊「運行」。 在「運行」對話框的「打開」文本框中,輸入「cmd」,然後單擊「確定」。 在命令提示處,鍵入下列命令: xcopy <源路徑> <目標路徑> 在此命令中,<源路徑> 是需要複製的源文件的完整路徑,包括驅動器、目錄和要複製的文件名。如果目錄下的全部文件都需要複製,可以省略文件名。<目標路徑> 是文件應該複製到的目錄的完整路徑。 以下的命令示例將 c:myWebApp 目錄下的所有文件複製到 d:liveapp 目錄下。 xcopy c:devapp d:liveapp回答所有關於所複製的文件或目錄的問題。 當需要更新應用程序的 Bin 目錄下存儲的 DLL 或更新任何其他應用程序文件時,都可以使用此過程。下面的示例將一個驅動器的 in 目錄中的一個 DLL 複製到另一個驅動器的 in 目錄下。xcopy c:devappinmyAssembly.dll d:liveappin同樣,一旦部署了應用程序,就可以使用此命令更新應用程序中的文件。雖然可以複製整個目錄,但是在複製個別文件時,在兩個目錄之間一次只能複製一個文件。可以使用 XCOPY /exclude 選項,從複製中排除子目錄、帶指定文件擴展名的文件或具體的文件名。有關如何使用 XCOPY 工具的更多信息,請打開操作系統的文檔並搜索 XCOPY。注意 對於 XCOPY 工具必須使用物理目錄名。不能使用虛擬目錄名。Visual Studio 中設計時的 Web 應用程序安全性當您在 Visual Studio 中工作以創建 Web 應用程序時,將需要在開發過程中訪問一些資源,與這種訪問相關的安全性存在一些特定的要求。這些要求不同於那些適用於應用程序用戶的要求。設計時的安全性要求包括: 訪問您的工作伺服器、資料庫伺服器以及其他屬於應用程序一部分的資源。 您選擇了哪種 Web 訪問方法(您如何向 Web 伺服器傳輸數據)。 以完全受信任模式運行代碼。 調試。 部署您的應用程序。 訪問開發資源為了在 Visual Studio 中創建和測試 Web 應用程序,您必須能夠訪問運行 Internet 信息服務 (IIS) 的計算機。在此伺服器(即開發伺服器,它不同於您在其中部署應用程序的生產伺服器)上,必須具有某些最低程度的特權,其中包括能夠將文件寫入伺服器並運行這些文件。Web 伺服器不必位於用於開發的同一台計算機上。但是,您必須至少在 Web 伺服器上安裝 Visual Studio 的伺服器組件,以使其支持應用程序的調試和部署。對資源的設計時訪問通常使用 Windows NT 身份驗證來處理,也就是說,作為開發人員,您使用自己的網路登錄憑據來獲取對所需資源的訪問權。當 Visual Studio 安裝完畢後,它會在伺服器上創建一個名為「VS Developers」(VS 開發人員)的組。該組具有在此計算機上開發 Web 項目所必需的全部文件、共享和 IIS 許可權。(計算機管理員可以進一步為該組配置自定義許可權,但這並不是必需的。)作為開發人員,您必須作為個人或您所屬的另一個組的成員成為該組的成員。授予「VS Developers」(VS 開發人員)組的特定許可權有: 訪問 Web 伺服器計算機的 wwwroot 目錄的許可權。 創建、修改和執行 Web 目錄中文件的許可權。 調試遠程 Web 應用程序的許可權。 安全說明 開發人員並不需要為使用某伺服器進行開發而具有該伺服器的管理員許可權。(但是,所有開發人員都必須是「VS Developers」(VS 開發人員)組的成員。)如果向開發人員授予不必要的管理員許可權,則可能會給網路造成安全性風險。如果您的應用程序需要訪問進一步的資源,您必須同樣地作為個人或作為組的成員建立對這些資源的訪問許可權。一個典型的示例就是 SQL Server。作為 Web 應用程序開發人員,您將需要能夠讀取(並在可能時更新)應用程序所需的資料庫表。對於某些方案,您還需要具有將存儲過程寫入伺服器的許可權;在其他方案中,則可能需要具有添加、改變或刪除表的許可權。Web 訪問方法Visual Studio 允許您以兩種方式訪問 Web 應用程序項目: 使用文件共享訪問(UNC 訪問)。在這種方式中,Visual Studio 使用基於 Windows 的文件管理命令將文件複製到伺服器上。 使用 FrontPage 伺服器擴展訪問。在這種方式中,將使用 HTTP 來傳輸文件。 文件共享訪問要求您與 Web 伺服器位於同一域中。實際上,這意味著您只能在自己的網路上使用文件共享訪問。對比之下,FrontPage 訪問允許跨越防火牆創建和管理應用程序(只要防火牆傳遞 HTTP 請求)。這樣,就可以通過 Internet 執行操作(當然也可以在您首選 HTTP 訪問的本地設置中執行操作)。這兩種訪問方法仍然要求使用 Visual Studio 伺服器組件、「VS Developers」(VS 開發人員)組等正確配置伺服器。同樣,您仍然需要在伺服器上具有足夠的特權才能創建、編寫和運行文件。以完全受信任模式運行代碼當 Visual Studio 運行時,設計器在設計時運行的用戶代碼將始終以完全受信任模式運行。即使該代碼最終部署到的環境將以限制較大的安全性來運行,情況也是如此。這包括兩層含義: 可能會因為將不安全代碼導入項目而給本地計算機帶來安全性風險。由於 Visual Studio 以完全受信任模式運行,導入的代碼會從 Visual Studio 繼承其許可權,而不安全的代碼將作為安全代碼來運行。只有在惡意用戶創建具有破壞性的代碼段(例如自定義控制項),而您隨後因疏忽導入並運行該代碼段的情況下,才需要注意這一問題。因此,在將代碼導入項目時,務必要加倍小心。 您在 Visual Studio 中創建的應用程序可能會在部署後無法正確運行,因為該代碼是在不同的安全性上下文中運行。 調試調試要求您能夠附加到在本地計算機(如果 Web 伺服器位於另一台計算機上,則為遠程計算機)上運行的進程。調試要求您使用「管理員」特權運行。如果您是在遠程計算機上進行調試,則必須在本地計算機上和遠程計算機上都具有相應的許可權。當 Visual Studio 安裝完畢後,它將創建一個名為「Debugger Users」(調試器用戶)的組,該組具有進行調試所必需的許可權。通過將開發人員和調試用戶劃分到不同的組,伺服器管理員可以向一個經過精選的組授予調試所必需的特權,而不是向所有使用 Visual Studio 的用戶授予這些特權。安全說明 「Debugger Users」組中的成員可有效地授予用戶管理級別特權。不要使不應具有這種級別特權的任何人成為此組的成員。部署應用程序當完成應用程序後,您必須能夠將它部署到生產伺服器。如果生產伺服器不屬於您,則對該伺服器的訪問可能會受到很多在您的開發伺服器上沒有的限制。部署 Web 應用程序的一種方法是使用 Visual Studio 部署工具。這種部署允許您執行應用程序的完全安裝(包括註冊和配置)。但是,它要求您對承載 Web 伺服器的計算機具有管理員許可權。此外,如果生產伺服器上安裝有 FrontPage 伺服器擴展,您也可以選擇通過 HTTP 使用 Copy Project 命令來進行部署。這種部署為您提供的部署功能較少,但卻允許您跨越防火牆進行部署。為了將文件寫入目標伺服器,您仍然必須在該伺服器上具有足夠的特權。運行時的 Web 應用程序安全性身份驗證ASP.NET 支持通過以下方法對用戶進行身份驗證。其中幾種方法與 IIS 身份驗證相重疊。有關詳細信息,請參見介紹 Web 應用程序安全性。身份驗證類型 說明 匿名訪問 用於未知用戶將在其中發出請求的應用程序(通常是公共 Web 應用程序)。與 IIS 重疊。 基本和簡要身份驗證 (與 IIS 重疊)在此方案中,將提示無憑據的用戶提供用戶名和密碼。 Windows 集成安全性 (NTLM) (與 IIS 重疊)如果發出請求的用戶已經在基於 Windows 的網路中進行了身份驗證,則在請求對資源的訪問時,IIS 就可以通過該用戶的憑據。 證書身份驗證 (與 IIS 重疊)在此方案中,客戶端具有已從第三方來源獲取的證書(數字標識)。該證書通過請求傳遞到您的應用程序。 Kerberos (與 IIS 重疊)Kerberos 身份驗證協議定義客戶端與稱作密鑰分發中心 (Key Distribution Center, KDC) 的網路身份驗證服務之間的交互。Windows 2000 在每個域控制器上以身份驗證服務的形式來實現一個 KDC。有關詳細信息,請參見 Kerberos 協議的基本概念。 Forms 身份驗證 如果需要對某用戶進行身份驗證,ASP.NET 則會將請求重定向到您指定的頁。該頁通常包含一個您要在其中獲取用戶名信息的窗體。(如需額外的安全性,可以使用 HTTPS 協議交換該窗體。)當應用程序獲取窗體信息時,它可以對用戶的憑據執行應用程序特定的檢查。值得注意的是,身份驗證進程在您的控制之下(與 IIS 不同),這使您能夠指定窗體的外觀並選擇存儲用戶信息的方式。 如果某用戶成功通過身份驗證,ASP.NET 將頒發一個包含特定標記的加密 Cookie,該標記將為後繼的訪問標識該用戶。Passport 身份驗證 利用 ASP.NET,您可以檢查那些具有從符合 Microsoft Passport 的應用程序中獲取的憑據的用戶。 如果某用戶成功通過身份驗證,ASP.NET 將頒發一個包含特定標記的加密 Cookie,該標記將為後繼的訪問標識該用戶。在 ASP.NET 應用程序中,Forms 身份驗證通常是最佳的選擇,因此它使您能夠在很大程度上控制如何對用戶進行身份驗證並允許您將身份驗證存儲在一個標記中。XML Web services 安全性XML Web services 使用 ASP.NET 並作為 Web 應用程序來運行,因此它們所參與的安全性模型與任何 ASP.NET 應用程序所參與的安全性模型都相同。例如,XML Web services 可能配置為使用基本身份驗證或 Windows 集成安全性。在設計時,當您嘗試向 XML Web services 添加引用(即請求 XML Web services 的發現文檔)時,該 XML Web services 將按照它的配置來執行標準的 Web 應用程序身份驗證。例如,如果 XML Web services 配置為使用基本身份驗證,該服務將需要從發出請求的客戶端獲取用戶名和密碼。在 Visual Studio 中,通常使用添加 Web 引用對話框來發現 XML Web services。例如,如果 XML Web services 使用的是基本身份驗證,「添加 Web 引用」對話框將提示您提供憑據。如果您正在生成的應用程序包含對 XML Web services 的調用,則需要確保在進行調用之前具有正確的憑據,否則該調用將會失敗。在運行時,可以通過在調用 XML Web services 的方法之前設置表示 XML Web services 的客戶端對象的 Credentials 屬性來向 XML Web services 傳遞憑據。由於其他 ASP.NET 安全性選項可能不夠靈活,XML Web services 可以實現一種憑據信息在 SOAP 標頭中進行傳遞的自定義身份驗證解決方案。在該解決方案中,憑據在客戶端和伺服器之間交換的消息的可選部分進行傳遞。然後可以編寫一個自定義的 HttpModule(實現 IHttpModule 介面),它可以偵聽標頭中的信息並調用您的身份驗證代碼。與其他 ASP.NET 應用程序相同,XML Web services 可能會實現基於特定角色的授權,以限制對應用程序特定部分的訪問。建立 SSL 和加密若要使用 SSL 和加密,必須獲取您所在公司或標識的伺服器證書。證書是一種數字簽名,它標識您的站點,使其無法被模擬。對於 Internet(公共)應用程序,可以從公認的第三方證書頒發機構獲取伺服器證書。對於私有 (Intranet) 應用程序,您自己就可以頒發伺服器證書。您這樣做的目的可能是為了確保內部應用程序(如個人站點)的安全。伺服器證書還使您能夠使用加密。SSL 使用一種稱作「公鑰加密」(public key encryption) 的加密方法。這種形式的加密機制中有兩個密鑰:公鑰用於對數據進行加密;私鑰由您密存,用於對用公鑰加密的信息進行解密。您所獲取的伺服器證書包含一個公鑰。當用戶需要使用 SSL 時,您的應用程序將向瀏覽器發送證書和公鑰。然後,瀏覽器和伺服器使用公鑰來建立一種對它們的信息交換進行加密的方式。注意 若要使用 SSL,瀏覽器必須支持長度至少為 40 位的加密。大多數瀏覽器都提供這種級別的加密。當獲取伺服器證書後,可以指示用戶將 https:// 用作前綴來獲取和發送 Web 頁,以使用 SSL。IIS 和瀏覽器將自動使用加密信道來交換信息。Web 應用程序的基本安全實施策略常規 Web 應用程序安全性建議有些最基本的安全性建議也是最顯然易見的。但是,如果惡意用戶可以使用簡單方法進入您的計算機,即使是最精心設計的應用程序安全性也會失敗。 經常進行備份,並將備份存放在安全的場所。 將您的 Web 伺服器計算機放置在安全的場所,這樣,未經授權的用戶就無法使用它、關閉它、帶走它,等等。 使用 Windows NTFS 文件系統,不使用 FAT32。NTFS 的安全性比 FAT32 高得多。有關詳細信息,請參見 Windows 文檔。 使用不易破解的密碼,確保 Web 伺服器計算機和同一網路上的所有計算機的安全。 確保 IIS 的安全。有關詳細信息,請參見 Microsoft 安全性 Web 站點 (http://microsoft.com/technet/treeview/default.asp?url=/technet/security/bestprac/mcswebbp.asp) 上的文章「管理 Windows IIS Web 服務的安全性」。 關閉不使用的埠並關閉不使用的服務。 運行監視通信量的病毒檢查程序。 建立並實施以下策略:禁止用戶將其密碼記在容易找到的位置。 使用防火牆。有關建議,請參見 Microsoft 安全性站點上的「核對清單:安裝防火牆」。(http://microsoft.com/security/articles/firewall.asp) 了解和安裝來自 Microsoft 和其他供應商的最新安全修補程序。例如,Microsoft 安全站點 (www.microsoft.com/security) 中有所有 Microsoft 產品的最新安全公告的列表。其他供應商也有類似站點。 使用 Windows 事件日誌記錄,並且經常檢查這些日誌,以查找可疑活動。這樣的活動包括:反覆嘗試登錄您的系統,以及向您的 Web 伺服器發出數量巨大的請求。 使用最少特權運行應用程序當您的應用程序運行時,它運行在一個具有本地計算機(還可能是遠程計算機)的特定特權的上下文中。請遵循這些指導: 在具有最少實用特權的上下文中運行應用程序。默認情況下,在 IIS 5 版中,ASP.NET 應用程序運行在名為 ASPNET 的本地用戶的上下文中。在 Windows Server 2003 上的 IIS 6 上,此帳戶稱為 NETWORK SERVICE。有關詳細信息,請參見 ASP.NET 進程標識和配置 ASP.NET 進程標識。 不要在系統用戶(管理員)的上下文中運行應用程序。 設置應用程序所需的所有資源上的許可權(ACL 或訪問控制列表)。使用最少的容許設置。例如,如果在您的應用程序中是可行的,則將文件設置為只讀。有關詳細信息,請參見 Windows 文檔。 將您的 Web 應用程序的文件保存在應用程序根目錄下的一個文件夾中。不要讓用戶指定在應用程序中進行文件訪問的路徑。這樣有助於防止用戶訪問伺服器的根目錄。 不要使不需要調試 Visual Studio 應用程序的任何人成為「Debugger Users」(調試器用戶)組的成員。此組具有比「VS Developers」(VS 開發人員)組更高的特權。有關詳細信息,請參見添加調試器用戶和配置 DCOM。 了解您的用戶在許多應用程序中,用戶有可能不必提供憑據即可訪問站點。如果是這樣,則您的應用程序通過在預定義用戶的上下文中運行即可訪問資源。默認情況下,此上下文是 Web 伺服器計算機上的本地 ASPNET 用戶(Windows 2000 或 Windows XP)或 NETWORK SERVICE 用戶 (Windows Server 2003)。若要僅允許已授權用戶進行訪問,請遵循以下準則: 如果您的應用程序是 Intranet 應用程序,則將其配置為使用 Windows 集成安全性。這樣,用戶的登錄憑據就可以用於訪問資源。 如果您需要從用戶收集憑據,則使用其中的一種 ASP.NET 身份驗證策略。有關更多信息,請參見 ASP.NET 身份驗證。有關示例,請參見簡單 Forms 身份驗證。 防止惡意用戶的輸入通常,決不假定從用戶獲得的輸入是安全的。對惡意用戶來說,從客戶端向您的應用程序發送潛在危險的信息是很容易的。若要防止惡意輸入,請遵循以下準則: 在窗體中,篩選用戶輸入以查找 HTML 標記,其中可能包含腳本。有關詳細信息,請參見在 Web 應用程序中防止腳本利用。 決不回顯(顯示)未經篩選的用戶輸入。在顯示不受信任的信息之前,對 HTML 進行編碼以將潛在有害的腳本轉換為顯示字元串。 類似地,決不將未經篩選的用戶輸入存儲在資料庫中。 如果要接受來自用戶的一些 HTML,則手動篩選它。在您的篩選器中,顯式定義將要接受的內容。不要創建一個試圖篩選出惡意輸入的篩選器;因為預料到所有可能的惡意輸入是非常困難的。 不要假定您從標頭(通常通過 Request 對象)獲得的信息是安全的。對查詢字元串、Cookie 等採取安全措施。注意瀏覽器向伺服器報告的信息(用戶代理信息)可以假冒,假如它在您的應用程序中是重要的。 如有可能,不要將敏感信息(如隱藏域或 Cookie)存儲在可從瀏覽器訪問的位置。例如,不要將用戶名或密碼存儲在 Cookie 中。 注意 視圖狀態是以編碼格式存儲在隱藏域中的。默認情況下,它包含消息身份驗證代碼 (MAC),以便頁可以確定視圖狀態是否已被篡改。創建安全的錯誤信息如果您不小心,惡意用戶就可以從應用程序顯示的錯誤信息推斷出有關您的應用程序的重要信息。請遵循這些指導: 不要編寫會回顯可能對惡意用戶有用的信息(例如用戶名)的錯誤信息。 將應用程序配置為不向用戶顯示詳細錯誤。如果為進行調試而要顯示詳細錯誤信息,請先檢查該用戶是否為 Web 伺服器的本地用戶。有關詳細信息,請參見顯示安全的錯誤信息。 對於容易發生錯誤的情況(如資料庫訪問)創建自定義錯誤處理方式。 安全地保守秘密「秘密」是指您不希望某人知道的信息。一個典型的秘密是密碼或加密密鑰。當然,如果惡意用戶能夠獲得秘密,則由該秘密保護的數據會受到危害。請遵循這些指導: 如果您的應用程序在瀏覽器和伺服器之間傳輸敏感信息,請考慮使用安全套接字層 (SSL)。有關如何實現 SSL 的詳細信息,請參見 Microsoft 知識庫文章 Q307267「HOW TO:在 Windows 2000 中使用安全套接字層來保障 XML Web services 的安全」(HOW TO: Secure XML Web Services with Secure Socket Layer in Windows 2000)。 如果您必須存儲秘密,即使是以您認為人們將無法看到它的形式(如在伺服器代碼中)進行保存,也不要將它保存在 Web 頁中。 如果您對信息加密,請不要創建您自己的加密演算法。請使用 Windows 數據保護 API (DPAPI)。 安全地使用 Cookie為了讓用戶特定的信息保持可用,Cookie 是一種容易而有用的方法。但是,由於 Cookie 會被發送到瀏覽器所在的計算機,因此它們容易被假冒或用於其他惡意用途。請遵循這些指導: 不要將任何關鍵信息存儲在 Cookie 中。例如,不要將用戶的密碼存儲在 Cookie 中,即使是暫時存儲也不要這樣做。通常,不要將任何信息保存在 Cookie 中(一旦它被假冒,就會給您帶來麻煩),而是在 Cookie 中保存對信息在伺服器上的位置的引用。 設置 Cookie 的到期日期,使其有效期儘可能最短。如有可能,避免設置永久性 Cookie。 考慮對 Cookie 中的信息加密。 防止拒絕服務威脅惡意用戶危害您的應用程序的一種間接方式是使其不可用。惡意用戶可以使應用程序太忙而無法為其他用戶提供服務,或者僅僅使應用程序出現故障。請遵循這些指導: 關閉或釋放您使用的任何資源。例如,在使用完畢後,始終關閉數據連接和數據讀取器,而且始終關閉文件。 使用錯誤處理(例如,try-catch)。包含 finally 塊,以便萬一失敗就可以在其中釋放資源。 將 IIS 配置為使用進程調節,這樣可以防止應用程序消耗過多的 CPU 時間。有關詳細信息,請參見技術文章「使用 Internet Information Server 5.0 的新功能:第 1 部分」。 在使用或存儲用戶輸入之前,測試它的大小限制。 對資料庫查詢的大小加以限制以確保安全。例如,在 Web 窗體頁中顯示查詢結果之前,檢查包含的記錄數是否不合理。 如果文件上載是您的應用程序的一部分,則對它們的大小加以限制。您可以使用類似如下的語法在 Web.config 文件中設置限制(其中 maxRequestLength 值以千位元組為單位): <configuration><system.web><httpRuntime maxRequestLength="4096" /></system.web></configuration>腳本利用從瀏覽器的角度來看,Web 頁只是一個長字元串。瀏覽器會順序處理這個字元串,在此過程中,會顯示某些字元,同時按特殊規則解釋其他字元(如 <b> 和 <script>)。如果惡意用戶可以將某些特殊字元插入到頁中,則瀏覽器將不知道這些字元不應該處於該位置,將作為頁的一部分處理它們。一個簡單化的腳本利用的工作方式如下所示。假定一個應用程序允許用戶發送有關最新電影的評論以供其他用戶閱讀。利用步驟可能為: 應用程序顯示一個用戶可以輸入評論的窗體。惡意用戶編寫了一個其中包含 <script> 塊的評論。 發送窗體,惡意用戶的評論將存儲在資料庫中。 另一用戶訪問該站點。在構造頁時,應用程序會從資料庫中讀取評論並將它們放在頁中。惡意用戶的 <script> 塊將寫入頁中,就好像它是文本評論一樣。 當第二個用戶的瀏覽器顯示此頁時,它將遇到 script 塊並執行它。 惡意用戶還可以使用其他方法來利用腳本。常見的情況是:大多數腳本利用都會要求應用程序接受惡意輸入,並將其插入到頁中(回顯它),瀏覽器將在該頁中執行它。這種利用帶來的潛在損害取決於所執行的腳本。它可以是無足輕重的,如在瀏覽器中彈出的煩人的消息。但是,它也可以產生嚴重的損害,方法是偷竊 Cookie、偷竊用戶輸入(如密碼),甚至在用戶的計算機上運行本機代碼(如果對 Internet 安全性的要求不嚴格)。防止腳本利用防止腳本利用的主要方法就是決不信任來自用戶的信息。假定從瀏覽器發送到您的應用程序的任何數據都包含惡意腳本。同樣,每次將字元串寫入頁時,您都應該假定字元串可能包含惡意腳本。(除非您自己以編程方式創建了該字元串。)例如,在從資料庫中讀取字元串時,您應該假定它們可能包含惡意腳本。安全意識很強的開發人員甚至不信任他們自己的資料庫,理由是他們認為惡意用戶可能有辦法篡改資料庫。ASP.NET 為您提供了幾種防止腳本利用的方法: ASP.NET 通過請求驗證來自動防止腳本利用。默認情況下,如果 Request 對象包含 HTML 編碼的元素或某些 HTML 字元(如表示長破折號的 —),則 ASP.NET 頁框架將引發一個錯誤。建議您為此錯誤在應用程序中創建一個處理程序。 如果您要在應用程序中顯示字元串,但不信任它們,則向它們應用 HTML 編碼。例如,進行編碼後,標記 <b> 將變成 &lt;b&gt;。如果您正在顯示的字元串來自您尚未確定信任其內容的資料庫時,您可能會這樣做。 如果您希望應用程序接受某些 HTML(例如,來自用戶的某些格式設置指令),請關閉自動檢查,並創建篩選器來精確定義應用程序將接受哪些 HTML。 安全說明 決不要禁用自動請求驗證而不添加您自己的檢查或篩選器。注意 不要創建試圖只篩選出不可接受元素的篩選器,因為預料每個可能的錯誤輸入十分困難。相反,如果您確實要創建篩選器,請創建具有可接受輸入的已定義列表的篩選器。在 Web 應用程序中防止腳本利用

大多數腳本利用發生在用戶可以將可執行代碼(腳本)插入您的應用程序時。默認情況下,ASP.NET 提供請求驗證。不管窗體發送包含什麼樣的 HTML,該驗證都會引發錯誤。您可以使用下列方法防止腳本利用:在接受或顯示字元串之前,將 HTML 編碼應用於它們,以便字元串不包括任何可執行元素。如果您的應用程序需要接受某些 HTML,則禁用請求驗證並創建您自己的 HTML 篩選器。本主題中的過程說明如何執行這些任務。應用 HTML 編碼HTML 編碼使用 HTML 保留字元轉換 HTML 元素,以便顯示它們而不是執行它們。應用 HTML 編碼在顯示字元串之前,調用 Server 對象的 HtmlEncode 方法。HTML 元素會轉換為瀏覽器將顯示(而不解釋為 HTML)的字元串表示形式。以下示例說明 HTML 編碼。在一個實例中,在顯示用戶輸入之前對其進行編碼。在第二個實例中,在顯示資料庫中的數據之前對其進行編碼。注意 只有通過向 @ Page 指令中添加 alidateRequest="false" 來在頁中禁用請求驗證時,此示例才將起作用。決不禁用請求驗證而不添加您自己的檢查或篩選器。『 Visual BasicPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e _As System.EventArgs) Handles Button1.ClickLabel1.Text = Server.HtmlEncode(TextBox1.Text)Label2.Text = _Server.HtmlEncode(dsCustomers.Customers(0).CompanyName)End Sub// C#private void Button1_Click(object sender, System.EventArgs e){Label1.Text = Server.HtmlEncode(TextBox1.Text);Label2.Text =Server.HtmlEncode(dsCustomers1.Customers[0].CompanyName);}篩選 HTML 元素默認情況下,Web 窗體頁檢測發送到伺服器的信息中的任何 HTML 元素和保留字元。這樣,將防止用戶試圖將腳本嵌入您的應用程序。當頁檢測到 HTML 時,它會引發一個錯誤。您可以使用 Page_Error 或 Application_Error 處理程序捕捉此錯誤。有關詳細信息,請參見顯示安全的錯誤信息。但是,如果您的應用程序需要接受某些 HTML 元素,可關閉請求驗證,並創建一個只允許使用要接受的 HTML 元素的篩選器。注意 不要創建試圖只篩選出不可接受元素的篩選器,因為預料每個可能的錯誤輸入十分困難。相反,如果您創建篩選器,則創建一個定義可接受輸入的篩選器。篩選 HTML 元素通過將屬性 ValidateRequest="false" 添加到 @ Page 指令中禁用請求驗證。安全說明 決不要禁用自動請求驗證而不添加您自己的檢查或篩選器。使用 HtmlEncode 方法對字元串進行編碼。調用 String.Replace 方法,將要接受的已編碼 HTML 標記轉換回它們的 HTML 形式。提示 如果您熟悉正則表達式,則可以使用一個正則表達式來高效地執行篩選。有關詳細信息,請參見 .NET Framework 正則表達式。以下示例說明一個簡單的篩選器,它接受加粗元素和帶下劃線的元素(<b>、</b>、<u>、</u>)。在顯示所有其他用戶輸入之前都對其進行編碼。安全說明 許多 HTML 標記都允許在其屬性中使用腳本。例如,標記 <img src="javascript:alert(『hi『)"> 是合法的。如果您希望接受比簡單的格式設置標記更複雜的 HTML 標記,則必須確保惡意用戶無法假借允許的 HTML 標記將腳本傳遞到您的應用程序。『 Visual BasicPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim userinput As String = TextBox1.Textuserinput = Server.HtmlEncode(userinput)『 Accepts <b>, </b>, <u>, </u>, case-insensitiveuserinput = userinput.Replace("&lt;b&gt;", "<b>")userinput = userinput.Replace("&lt;/b&gt;", "</b>")userinput = userinput.Replace("&lt;B&gt;", "<B>")userinput = userinput.Replace("&lt;/B&gt;", "</B>")userinput = userinput.Replace("&lt;u&gt;", "<u>")userinput = userinput.Replace("&lt;/u&gt;", "</u>")userinput = userinput.Replace("&lt;U&gt;", "<U>")userinput = userinput.Replace("&lt;/U&gt;", "</U>")Label1.Text = userinputEnd Sub// C#private void Button1_Click(object sender, System.EventArgs e){String userinput = TextBox1.Text;userinput = Server.HtmlEncode(userinput);// Accepts <b>, </b>, <u>, </u>, case-insensitiveuserinput = userinput.Replace("&lt;b&gt;", "<b>");userinput = userinput.Replace("&lt;/b&gt;", "</b>");userinput = userinput.Replace("&lt;B&gt;", "<B>");userinput = userinput.Replace("&lt;/B&gt;", "</B>");userinput = userinput.Replace("&lt;u&gt;", "<u>");userinput = userinput.Replace("&lt;/u&gt;", "</u>");userinput = userinput.Replace("&lt;U&gt;", "<U>");userinput = userinput.Replace("&lt;/U&gt;", "</U>");Label1.Text = userinput;}

SQL 語句利用還有一種與腳本利用類似的利用,它導致惡意 SQL 語句的執行。如果應用程序提示用戶輸入信息並將用戶的輸入串聯為表示 SQL 語句的字元串,則會出現這種情況。例如,應用程序可能提示輸入客戶姓名,目的是為了執行類似如下的語句:"Select * From Customers where CustomerName = " & txtCustomerName.Value但是,對資料庫有所了解的惡意用戶可能使用文本框輸入包含客戶姓名的嵌入式 SQL 語句,產生類似如下的語句:Select * From Customers Where CustomerName = 『a『 Delete From Customers Where CustomerName > 『『執行該查詢時,就會危害資料庫。為了防止 SQL 語句利用,決不使用字元串串聯創建 SQL 查詢。相反,使用參數化查詢並將用戶輸入分配給參數對象。數據適配器命令中的參數

數據適配器的命令(在 SelectCommand、InsertCommand、UpdateCommand 和 DeleteCommand 對象的 CommandText 屬性中定義)經常涉及參數。在運行時,參數用於向命令代表的 SQL 語句或存儲過程傳遞值。參數在兩種上下文中使用:選擇參數 - 在產品應用程序中,經常只獲取資料庫中數據的一個子集。其做法是,使用包含 WHERE 子句的 SQL 語句或存儲過程,該子句具有用於獲得選擇判據(在運行時獲取)的參數。此外,當更新或刪除記錄時,將使用 WHERE 子句指出要更改的一條或多條記錄。WHERE 子句中使用的值通常在運行時導出。更新參數 - 當更新現有記錄或插入新記錄時,已更改記錄或新記錄中列的值將在運行時建立。此外,開放式並發檢查中使用的值也使用參數來建立。注意 對於 Oracle,在 SQL 語句或存儲過程中使用命名參數時,必須在參數名稱前加冒號 (:)。但是,當在代碼中的其他地方引用命名參數時(例如,當調用 Add 時),不要在命名參數前加冒號 (:)。數據提供程序自動提供冒號。有關更多信息,請參見 OracleParameter 類。選擇參數當選擇記錄來填充數據集時,經常在 WHERE 子句中包括一個或多個參數,以便能夠在運行時指定要獲取哪些記錄。例如,用戶可能會搜索書籍資料庫以查找其鍵入 Web 頁的特定書名關鍵字。為了允許該操作,可以指定如下 SQL 語句作為 SelectCommand 的 CommandText 屬性。參數用佔位符(問號)或命名參數變數指示。涉及 OleDbCommand 和 OdbcCommand 對象的查詢的參數使用問號;使用 SqlCommand 對象的查詢使用以 @ 符號開頭的命名參數,而使用 OracleCommand 對象的查詢使用以冒號 (:) 開頭的命名參數。使用佔位符的查詢可能如下所示:SELECT BookId, Title, Author, Price from BOOKSWHERE (Title LIKE ?)使用 SqlCommand 命名參數的查詢可能如下所示:SELECT BookId, Title, Author, Price from BOOKSWHERE (Title LIKE @title)使用 OracleCommand 命名參數的查詢可能如下所示:SELECT BookId, Title, Author, Price from BOOKSWHERE (Title LIKE :title)在應用程序中,您提示用戶輸入書名關鍵字。然後設置參數值並運行命令。注意 有時,您可能需要獲取資料庫表的全部內容(例如在建立查找表時),但通常只需要獲取所需數據以使應用程序效率較高。在 Visual Studio 中,可以使用「查詢生成器」生成帶參數的 SQL 語句。如果從「伺服器資源管理器」拖動元素,Visual Studio 可在某些情況下(但非所有情況下)配置參數,並且您需要手動完成配置。更新參數無論適配器的 SelectCommand 對象是否包含參數化命令,UpdateCommand、InsertCommand 和 DeleteCommand 屬性的命令始終包含參數。UpdateCommand 和 InsertCommand 屬性的命令對於資料庫中要更新的每一列都需要參數。此外,UpdateCommand 和 DeleteCommand 語句需要參數化的 WHERE 子句,它標識要更新的記錄,其方式與經常配置 SelectCommand 對象的方式類似。設想用戶可以用其購買書籍的應用程序。用戶在購物時將維護一個購物車(以數據表的形式實現)。在 ShoppingCart 表中,用戶為要購買的每本書維持一條記錄,以書籍 ID 和客戶 ID 一起作為購物車記錄的鍵。當用戶向購物車添加書籍時,應用程序可能調用 SQL INSERT 語句。在適配器中,該語句的語法可能如下所示:INSERT INTO ShoppingCart(BookId, CustId, Quantity)Values (?, ?, ?)三個問號代表參數佔位符,它們將在運行時以客戶 ID、書籍 ID 和數量的值填寫。如果打算使用命名參數,同樣的查詢可能如下所示:INSERT INTO ShoppingCart(BookId, CustId, Quantity)Values (@bookid, @custid, @quantity)如果用戶決定更改購物車中的某一項(例如更改其數量),則應用程序可能調用 SQL UPDATE 語句。該語句的語法可能如下所示:UPDATE ShoppingCartSET (BookId = ?, CustId = ?, Quantity = ?)WHERE (BookId = ? AND CustId = ?)或者如果打算使用命名參數,則可能如下所示:UPDATE ShoppingCartSET (BookId = @bookid, CustId = @custid, Quantity = @quantity)WHERE (BookId = @bookid AND CustId = @custid)在該語句中,SET 子句中的參數以已更改記錄的更新值填寫。WHERE 子句中的參數標識要更新哪條記錄,並且以來自該記錄的原始值填寫。用戶還可以從購物車移除項。在此情況下,如果打算使用參數佔位符,則應用程序可能調用具有如下語法的 SQL DELETE 語句:DELETE FROM ShoppingCartWHERE (BookId = ? AND CustId = ?)或者如果打算使用命名參數,則可能如下所示:DELETE FROM ShoppingCartWHERE (BookId = @bookid AND CustId = @custid)參數集合和參數對象為允許您在運行時傳遞參數值,數據適配器的四個命令對象均支持 Parameters 屬性。該屬性包含單個參數對象的集合,這些對象與語句中的佔位符一一對應。下表顯示了與每個數據適配器相對應的參數集合:數據適配器 參數集合SqlDataAdapter SqlParameterCollectionOleDbDataAdapter OleDbParameterCollectionOdbcDataAdapter OdbcParameterCollectionOracleDataAdapter OracleParameterCollection注意 對於 Oracle,在 SQL 語句或存儲過程中使用命名參數時,必須在參數名稱前加冒號 (:)。但是,當在代碼中的其他地方引用命名參數時(例如,當調用 Add 時),不要在命名參數前加冒號 (:)。Oracle .NET Framework 數據提供程序會自動提供冒號。使用參數集合,您可省去必須手動將 SQL 命令構造為具有運行時值的字元串的麻煩。此外,還獲得在參數中進行類型檢查的好處。如果使用「數據適配器配置嚮導」配置適配器,則為所有四個適配器命令自動建立和配置參數集合。如果從「伺服器資源管理器」將元素拖動到窗體或組件上,則 Visual Studio 可以執行下列配置:如果將表或某些列拖動到設計器上,則 Visual Studio 將生成一個不帶參數的 SelectCommand 對象(明確地說是一條 SQL SELECT 語句),以及參數化的 UpdateCommand、InsertCommand 和 DeleteCommand 對象。如果希望 SelectCommand 對象語句有參數,則必須手動進行配置。如果將存儲過程拖動到設計器上,則 Visual Studio 將生成一個 SelectCommand 對象,帶有存儲過程所需的參數。但是,如果需要,您必須自己配置 UpdateCommand、InsertCommand 和 DeleteCommand 對象及其參數。一般而言,如果想為適配器創建參數化查詢,則應使用「數據適配器配置嚮導」。但是,如果需要,可以使用「屬性」窗口手動配置參數。參數集合的結構命令的參數集合中的項與相應的命令對象所需的參數一一對應。如果命令對象是一條 SQL 語句,則集合中的項對應於該語句中的佔位符(問號)。以下 UPDATE 語句需要有五個參數項的集合:UPDATE ShoppingCartSET (BookId = ?, CustId = ?, Quantity = ?)WHERE (BookId = ? AND CustId = ?)以下是帶有命名參數的相同語句:UPDATE ShoppingCartSET (BookId = @bookid, CustId = @custid, Quantity = @quantity)WHERE (BookId = @bookid AND CustId = @custid)如果命令對象引用的是存儲過程,則集合中的參數項數由該過程本身決定。參數與 SQL 語句中的佔位符可能不完全對應。在存儲過程中,還可以對參數進行命名。在此情況下,參數在集合中的位置並不重要。相反,集合中的每個參數項都有一個 ParameterName 屬性,用於使自身與存儲過程中的相應參數匹配。當手動配置參數集合時,必須確切理解哪些參數是存儲過程需要的。許多存儲過程返回值;如果是這樣,該值在參數集合中傳遞迴應用程序,因此您必須允許返回值。此外,某些存儲過程包含多條 SQL 語句,您必須確保參數集合反映傳遞給過程中的全部語句的所有值。如果參數不是命名參數(如在存儲過程中那樣),則集合中的項按位置映射到命令所需的參數。如果命令是一個存儲過程並且返回值,則為該返回值保留集合中的第一項(零項)。因此,可以根據集合中的索引位置引用單個參數對象。但是,參數對象還支持 ParameterName 屬性,它提供一種獨立於參數順序來引用參數的方法。例如,下面兩條語句可能等效(假定集合中的第二個參數被命名為 Title_Keyword):『 Visual Basic『 Encloses the keyword in SQL wildcard characters.titleKeyword = "%" & txtTitleKeyword.Text & "%"OleDbDataAdapter1.SelectCommand.Parameters(1).Value = titleKeywordOleDbDataAdapter1.SelectCommand.Parameters("Title_Keyword").Value = titleKeyword// C#// Encloses the keyword in SQL wildcard characters.string titleKeyword = "%" + txtTitleKeyword.Text + "%";this.OleDbDataAdapter1.SelectCommand.Parameters[1].Value = titleKeyword;this.OleDbDataAdapter1.SelectCommand.Parameters["Title_Keyword"].Value = titleKeyword;編程時使用參數名通常比通過索引值引用參數好得多,因為它減少了在參數個數變化時的維護需要,並使您不必記憶存儲過程是否返回值。通過名稱而不是索引值來引用參數存在少許附加系統開銷,但這可通過編程方便和應用程序的可維護性抵消。建立參數值建立參數值的方式有兩種:通過顯式設置參數的 Value 屬性。通過將參數映射到數據集表中的列,以便可以在需要時從數據行提取值。在填充數據集或調用命令時顯式設置參數值(即對於選擇參數)。例如,在上面搜索書籍的示例中,應用程序可能有一個文本框,用戶在該框中輸入書名關鍵字。然後,您在調用適配器的 Fill 方法之前,將參數的值顯式設置為文本框的文本。完成該操作的代碼可能如下所示,它在填充數據集之前將文本框的內容建立為參數。『 Visual Basic『 Encloses the keyword in SQL wildcard characters.titleKeyword = "%" & txtTitleKeyword.Text & "%"OleDbDataAdapter1.SelectCommand.Parameters("Title_Keyword").Value = titleKeywordOleDbDataAdapter1.Fill(dsAuthors1)// C#// Encloses the keyword in SQL wildcard characters.titleKeyword = "%" + txtTitleKeyword.Text + "%";this.OleDbDataAdapter1.SelectCommand.Parameters["Title_Keyword"].Value = titleKeyword;this.OleDbDataAdapter1.Fill(dsAuthors1);映射的參數值在更新中使用。當調用適配器的 Update 方法時,該方法依次處理數據集表中的記錄,分別為每條記錄進行適當更新(更新、插入或刪除)。在此情況下,參數值已可以作為數據集記錄中的列使用。例如,當更新進程到達數據集表中的一個新記錄(必須為其在資料庫中調用 INSERT 語句)時,INSERT 語句的 VALUE 子句的值可以從該記錄直接讀出。這些是典型方案,但不是唯一的幾個方案。存儲過程有時使用 out 參數或通過過程的返回值返回數據。如果是這樣,返回值應映射到數據集表中的列。也有可能顯式設置更新參數。適配器支持 RowUpdating 事件,每次更新行時都將調用該事件。可以為該事件創建一個處理程序,並在其中設置參數值。這使您可以對參數值進行十分精確的控制,並可以執行諸如下面的處理:在參數值寫入資料庫記錄之前動態創建參數值。

推薦閱讀:

【皇極梅花】卦筮:「伏象」與「覆象」,梅花卦象中的經典用法
盲派對火、土、水、金的解釋【四柱經典】
經典香港黑幫電影 你看過幾部
最經典的中國老話,句句道破人性!(珍藏)

TAG:經典 | .NET | ASP.NET | NET入門 | 入門 | 論壇 |