建立 ASP.NET 2.0 應用程式時,開發人員通常將敏感設定資訊儲存在 Web.config 檔案中。最典型範例是資料庫連接字串,其他還包括 SMTP 伺服器連線資訊、用戶憑證資料等。雖然預設可配置 ASP.NET 拒絕所有對 .config 副檔名檔案的 HTTP 請求,但若駭客能存取 Web 伺服器檔案系統,Web.config 中的敏感資訊仍可能被竊取。例如,不小心允許匿名 FTP 存取網站,駭客即可透過 FTP 協定下載 Web.config。
所幸,ASP.NET 2.0 允許加密 Web.config 中選擇的區段(如 <connectionStrings> 區段或自訂 config 區段)來緩解此問題。設定區段可輕易使用程式碼或 aspnet_regiis.exe(命令列程式)預先加密。一旦加密,Web.config 設定即可避開「虎視眈眈」的眼睛。而且,當以程式設計方式從 ASP.NET 頁面檢索加密設定時,ASP.NET 會自動解密讀取的加密區段。簡言之,設定資訊加密後,無需在應用程式中撰寫額外程式碼或採取進一步行動即可使用加密資料。
本文將討論如何以程式設計方式加密與解密設定區段,分析命令列程式 aspnet_regiis.exe 用法,評估 ASP.NET 2.0 提供的加密選項,並簡略討論 ASP.NET 1.x 中如何加密設定資訊。
開始探討如何加密 ASP.NET 2.0 設定資訊前,請記住以下幾點:
分析如何加密 ASP.NET 2.0 設定資訊前,先看能加密什麼設定資訊。使用 .NET Framework 2.0 提供的函式庫,開發人員能加密 Web.config 或 machine.config 中大多數設定區段。這些區段是作為 <configuration> 或 <system.web> 元素子節點的 XML 元素。例如,下列範例 Web.config 含三個顯式定義的設定區段:
<connectionStrings>,<compilation>和<authentication>。
<?xml version="1.0"?>
<configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0">
<connectionStrings>
<add name="MembershipConnectionString" connectionString="connectionString"/>
</connectionStrings>
<system.web>
<compilation debug="true"/>
<authentication mode="Forms" />
</system.web>
每個區段都可選擇性加密,透過程式設計方式或 aspnet_regiis.exe 實現。加密後,加密文字直接儲存在設定檔中。例如,加密上述 <connectionStrings> 區段,結果 Web.config 可能如下(因篇幅限制,省略大段 <CipherValue>):
<?xml version="1.0"?>
<configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
<system.web>
<compilation debug="true"/>
<authentication mode="Forms" />
</system.web>
另外,存在一些無法使用此技術加密的設定區段:
為加密這些區段,必須加密這些值並存儲在登錄中。有 aspnet_setreg.exe 命令列工具可協助實現此過程;稍後討論此工具。
Web.config 指定特定 Web 應用程式的設定,位於應用程式根目錄;machine.config 指定該 Web 伺服器上所有網站的設定,位於 $WINDOWSDIR$\Microsoft.Net\Framework\Version\CONFIG 目錄。