保護標準控制項
更新:2007 年 11 月
ASP.NET 標準控制項是一組控制項,可讓您建立表單,供使用者於網頁回傳至伺服器之前在其中輸入或選取資訊。標準控制項是 Web 伺服器控制項,繼承自 Control 類別。Web 伺服器控制項範例包含 TextBox、Image 和 AdRotator 控制項。這個主題中的資訊說明組態和編碼最佳作法,有助於改善標準控制項的安全性。
雖然下列程式碼編寫和組態最佳作法有助於改善應用程式的安全性,但是持續保持應用程式伺服器使用最新的 Microsoft Windows 和網際網路資訊服務 (IIS) 安全性更新,以及任何 Microsoft SQL Server 或其他資料來源的安全性更新,仍是非常重要的工作。
關於撰寫安全的程式碼和保護應用程式安全性之最佳做法的詳細資料,請參閱 Michael Howard 和 David LeBlance 所著的《撰寫安全的程式碼》一書,或參閱 Microsoft Patterns and Practices 所提供的指南。
在下列主題中,可以取得其他控制項型別之特別安全性作法的詳細資訊:
AdRotator 控制項
AdRotator 控制項會顯示通告檔 (預設值為 XML 檔) 中所定義的通告。另外,您可以在資料庫中儲存通告,並以程式的方式擷取之。若要協助確保 AdRotator 控制項的安全,請遵循以下方針:
如果使用 XML 檔儲存通告資訊,為了不提供該資料夾的內容以回應 Web 要求,所以請將該檔案放在網站的 App_Data 資料夾中。
若要取得額外的保護,請不要在通告檔中使用副檔名 .xml。改為使用如 .ads 的副檔名,然後在網站的 Web.config 檔內使用下列項目,將 .ads 副檔名對應至 IIS 中的 ASP.NET,以及對應至 ASP.NET 中所禁止的處理常式:
<httpHandlers> <add verb="*" path="*.ads" type="System.Web.HttpForbiddenHandler" /> </httpHandlers>
如需如何將副檔名對應到 IIS 中之 ASP.NET 的詳細資訊,請參閱 HOW TO:登錄 HTTP 處理常式.
為讀取通告檔的使用者帳戶設定適當的使用權限 (通常為唯讀)。如果網站支援匿名存取,則這通常會是本機 ASPNET 使用者帳戶或 NETWORK SERVICE 帳戶。
如果通告檔不存在,則 AdRotator 控制項會引發顯示檔案路徑和名稱的錯誤,這可能會洩漏敏感性資訊。請遵循適當的錯誤處理技術以避免這個問題,包括設定組態檔中的 customErrors 項目,以重新導向至自訂錯誤頁面,以及建立在應用程式任何位置發生未處理例外狀況時呼叫的全域錯誤處理常式。如需詳細資訊,請參閱 HOW TO:顯示安全錯誤訊息。
如果讀取資料庫的通告資訊,請遵循保護資料庫存取權的方針。如需詳細資訊,請參閱設定資料存取的安全性。
仔細檢視從未受信任來源取得的所有通告資訊之後,才可將其與 AdRotator 控制項搭配使用。因為 AdRotator 控制項既不執行任何驗證,也不檢查從通告檔讀取的資訊,所以它所呈現的 Web 網頁影像和 URL 與其在通告檔或資料庫中的顯示方式完全一樣。
BulletedList、CheckBoxList、RadioButtonList、DropDownList、ListBox
BulletedList、CheckBoxList、DropDownList、ListBox 和 RadioButtonList 控制項,根據集合內容或根據資料庫中的資料,呈現不同型別的 HTML 項目 (ul、input 和 select)。若要協助保護這些控制項,請遵循下列方針:
如果控制項從資料庫進行讀取,請遵循保護資料庫存取權的方針。如需詳細資訊,請參閱設定資料存取的安全性。
如果不確定要顯示的資訊是否包含指令碼或其他標記,則在顯示之前,先處理控制項的 DataBinding 事件,並以 HTML 編碼資訊。如需詳細資訊,請參閱 HOW TO:利用將 HTML 編碼套用至字串的方法,防止會在 Web 應用程式中發生的指令碼攻擊。
如果設定 BulletedList 控制項以顯示圖形或超連結,請確定圖形或連結的 URL 指向信任的位置。
Calendar 控制項
Calendar 控制項呈現 LinkButton 控制項,以啟用月曆中的巡覽。LinkButton 控制項使用用戶端指令碼執行回傳。如果瀏覽器基於安全性考量已關閉用戶端指令碼,則 Calendar 控制項不支援巡覽。
您可以一律使用 Calendar 控制項顯示日期 (即使不使用它來啟用日期巡覽)。不要假設 Calendar 控制項中選取的所有日期格式都是正確的。將日期從 Calendar 控制項轉換至內部 DateTime 格式時,請確定在日期格式錯誤時使用適當的錯誤處理。
FileUpload 控制項
FileUpload 控制項可讓使用者將檔案從他們的電腦上載至 Web 伺服器電腦。若要協助確保 FileUpload 控制項的安全,請遵循以下方針:
不要信任使用者上載的檔案,惡意使用者可能會嘗試上載可執行檔。儲存上載的檔案時,檢查其副檔名,或向檔案指派您自己的副檔名。
不要允許使用者為用於儲存上載檔案的位置指定任意路徑。檢查檔案名稱不包含您自己尚未加入的路徑資訊。
請不要顯示網站的內部結構,讓上載檔案的使用者看到。
在儲存上載檔案的資料夾上,針對執行應用程式的使用者帳戶設定讀寫使用權限。如果網站支援匿名存取,這通常會是本機 ASPNET 使用者帳戶或 NETWORK SERVICE 帳戶。不過,請將讀寫使用權限限制成應用程式用來儲存上載檔案的資料夾。
若要進行防護以抵禦拒絕服務的攻擊,請設定組態檔中 httpRuntime 項目的 maxRequestLength 屬性 (Attribute)。根據預設,最大要求長度是 4 MB。其他會影響上載檔案大小的組態設定是 httpRuntime 項目的 requestLengthDiskThreshold 屬性和 processModel 項目的 memoryLimit 屬性。
查詢控制項所傳回之 HttpPostedFile 物件的 ContentLength 屬性 (Property),以判斷上載檔案的大小,並使用該大小來決定是否要接受該檔案。
HiddenField 控制項
HiddenField 控制項為您提供一種方法,以在伺服端程式碼中設定 HTML <input type="hidden"> 項目的內容。隱藏欄位用於儲存網頁中的資訊,該資訊用於網頁處理期間,但不應由使用者查看。若要協助確保 HiddenField 控制項的安全,請遵循以下方針:
不要在 HiddenField 控制項中儲存敏感資訊。儘管該資訊在瀏覽器中不可見,但是它是網頁的一部分,使用者可以在網頁來源中輕易地檢視之。
不要信任隱藏欄位中的資訊。惡意使用者會對隱藏欄位中的內容進行修改。
超連結
HyperLink 控制項將 URL 呈現至瀏覽器。請確定 URL 指向信任的位置。
Image 和 ImageMap 控制項
Image 和 ImageMap 控制項將 URL 呈現至瀏覽器,以顯示圖形。請確定 URL 指向信任的位置。
ImageButton 控制項
ImageButton 控制項呈現影像 (img 項目),該影像使用用戶端指令碼執行回傳。如果瀏覽器基於安全性考量已關閉用戶端指令碼,則該控制項不起作用。
控制項將 URL 呈現至瀏覽器,以顯示圖形。請確定 URL 指向信任的位置。
Label 和 Literal 控制項
Label 和 Literal 控制項只要將文字以原狀顯示給瀏覽器,即可在網頁上顯示該文字 (此外,Label 控制項可讓您指定格式)。如果文字包含 HTML 標記,則瀏覽器預設會解譯標記並相應呈現文字,這可能包括執行指令碼。
如果使用 Label 控制項,且不確定文字是否包含惡意內容,請使用 HTML 編碼將 HTML 轉換為文字表示。如需詳細資訊,請參閱 HOW TO:利用將 HTML 編碼套用至字串的方法,防止會在 Web 應用程式中發生的指令碼攻擊。
如果使用 Literal 控制項,且不確定文字是否包含惡意內容,請執行下列其中一項:
將控制項的 LiteralMode 屬性設為 Encode,這可以自動編碼 HTML 內容。
使用 HTML 編碼,可以將 HTML 轉換為文字表示。如需詳細資訊,請參閱 HOW TO:利用將 HTML 編碼套用至字串的方法,防止會在 Web 應用程式中發生的指令碼攻擊。
如需詳細資訊,請參閱 HOW TO:利用將 HTML 編碼套用至字串的方法,防止會在 Web 應用程式中發生的指令碼攻擊。
LinkButton 控制項
LinkButton 控制項呈現連結 (a 項目),該連結使用用戶端指令碼執行回傳。如果瀏覽器基於安全性考量已關閉用戶端指令碼,則該控制項不起作用。
MultiView
MultiView 控制項可讓您加入多個 View 控制項,並有條件地顯示它們。這可讓您建立類似多頁表單的網頁。
如果根據易於修改的項目 (例如 URL 查詢字串) 切換檢視,則會讓某些人看到他們不應看到的檢視。因此,請確定切換檢視的機制盡可能安全。如需詳細資訊,請參閱 ASP.NET 狀態管理概觀。
TextBox 控制項
因為 TextBox 控制項幾乎允許使用者在網頁內輸入任何文字,所以使用這個控制項接受使用者輸入時必須十分小心。若要協助確保 TextBox 控制項的安全,請遵循以下方針:
在可能的情況下,使用驗證控制項將使用者的輸入限制為可接受值。如需詳細資訊,請參閱驗證控制項簡介。
執行伺服端程式碼之前,請確定 IsValid 屬性是設為 true。
使用額外的伺服器驗證。特別是對 CustomValidator 控制項更該如此,不要只建立用戶端驗證邏輯。
設定 TextBox 控制項的 MaxLength 屬性,以限制使用者可輸入的文字量。惡意使用者可以透過在文字方塊中傳送大量資訊,影響應用程式的效能,並可能導致資料庫錯誤。
使用 HtmlEncode 方法對使用者輸入進行編碼,這會將 HTML 轉換為文字表示 (例如,<b> 會變成 <b>),並有助於防止 HTML 在瀏覽器中執行。如需詳細資訊,請參閱 HOW TO:利用將 HTML 編碼套用至字串的方法,防止會在 Web 應用程式中發生的指令碼攻擊。
將 TextMode 屬性設為 Password,防止在文字方塊內檢視文字方塊的內容 (會以點符號顯示)。請注意,將 TextMode 屬性設為 Password 並不會提供任何其他保護,不會加密文字方塊的內容,也不會讓內容變模糊,而且會將資訊以純文字格式傳送給伺服器。因此,使用 Password 時,請提供其他方法來確定該資料是受到保護的。
如果收集敏感性資訊 (例如密碼或信用卡卡號),請使用 Secure Sockets Layer (SSL) 來保護用戶端與伺服器間之通訊的安全性。這適用於任何使用 TextBox 控制項的情況,包含併入 TextBox 控制項的控制項 (例如 CreateUserWizard 控制項)。
精靈
Wizard 控制項可讓您建立多步驟資料表單。使用 Wizard 控制項時,請留意下列安全性考量:
Wizard 原本並不會保護敏感性資訊。如果在精靈中收集敏感性資料,請針對包含 Wizard 的網頁,使用 SSL 保護用戶端與伺服器之通訊的安全性。
Wizard 控制項包含許多不可見的控制項,以支援其功能。使用者可能可以管理那些控制項及其值,不按順序顯示精靈步驟,或顯示只應顯示給部分使用者的精靈步驟。為了協助防止這個問題,請確定是以正確的順序顯示精靈步驟,且除非條件正確,否則不會顯示具有敏感性資訊的步驟。
XML 控制項
Xml 控制項顯示在網頁上包含 XML 之 XML 檔或字串的內容,選擇性地套用 XML 轉換。若要協助確保 Xml 控制項的安全,請遵循以下方針:
顯示 XML 檔的內容時,為了不提供該資料夾的內容以回應 Web 要求,所以如果可行,請將 XML 檔置於網站的 App_Data 資料夾中。
只顯示信任來源的 XML。
只使用信任來源的轉換。