如果未知使用者可以存取您的 Web 應用程式,則惡意使用者一定會嘗試取得對應用程式未經授權的存取。網際網路上可公開存取的伺服器通常每天都會受到對其弱點的探查。因此,建議您採取預防措施並對所有 Web 應用程式建置安全性機制。
如需撰寫安全程式碼和保護應用程式之最佳作法的詳細資訊,請參閱 Michael Howard 和 David LeBlanc 所著的《撰寫安全的程式碼》一書,以及 Microsoft 典範與實例 所提供的指引。
實作安全性只是方案的一部分。另一個重點就是警戒心。即使系統擁有許多安全性保護,仍然需要以下列幾種方式密切注意:
開發更安全應用程式的要點在於了解它所面對的威脅為何。Microsoft 已開發用來將威脅分類的方法:假冒 (Spoofing)、竄改 (Tampering)、否認 (Repudiation)、資訊洩露 (Information disclosure)、拒絕服務 (Denial of service)、提高權限 (Elevation of privilege),縮寫為 STRIDE。以下章節簡短描述這些威脅,以及這些威脅如何入侵 Web 應用程式。
假冒
假冒是以未授權的方式模擬使用者或處理序 (Process)。假冒當中最簡單的方法,可能是在不同使用者的認證中輸入。惡意使用者可能也會變更 Cookie 的內容,偽裝成另一名使用者,或是假裝 Cookie 來自不同的伺服器。
一般而言,您可使用嚴格驗證 (Authentication) 來避免發生假冒身分。只要有人要求存取非公用資訊時,必須確認他們的身分。藉由將認證資訊存放在安全的地方,也可防範發生假冒情形。例如,不要將密碼或其他敏感資訊放在 Cookie 中,因為惡意使用者可在其中輕易找到它並加以修改。
竄改
竄改代表未經授權變更或刪除資源。一個範例是毀壞網頁,惡意使用者進入您的網站並變更檔案。一個竄改的間接方法是「指令碼攻擊」(Script Exploit)。惡意使用者能夠取得要執行的程式碼 (指令碼),方法是將其偽裝成表單的使用者輸入或連結。
防範竄改的主要措施是使用 Windows 安全性鎖定檔案、目錄和其他 Windows 資源。應用程式還應該以最小權限執行。只要不信任來自任一使用者甚至是資料庫的所有資訊,即可防止指令碼遭到入侵。只要從未受信任的來源取得資訊,一定要確認它不含任何可執行程式碼,對其進行處理。
否認
否認威脅是指以這樣的方式執行交易,即在交易涉及主體時沒有任何證明。在 Web 應用程式中,這可能表示模擬無辜使用者的認證。同樣地,您可使用嚴格驗證的方式防範否認性攻擊。此外,使用 Windows 的登入功能,將伺服器上任何活動的審核記錄保留下來。如需詳細資訊,請參閱記錄應用程式、伺服器和安全性事件。
資訊洩露
資訊洩露表示竊取或洩露原本應該是私用的資訊。典型的範例是竊取密碼,但也可能涉及對伺服器上任何檔案或資源的存取。
對於資訊洩露的最佳防範措施,就是不要讓可洩露的資訊存在。例如,如果不儲存密碼,惡意使用者就無法竊取 (另一個儲存密碼的替代方式是只儲存密碼的雜湊。當使用者出示認證時,可將使用者密碼製作雜湊,並只比較兩者的雜湊)。
如果要儲存敏感資訊,使用 Windows 安全性來確保它的安全。一如往常,您應使用驗證確保只有經過授權的使用者能夠存取受限制的資訊。如果您必須公開 (Expose) 敏感資訊,則建議您在儲存資訊時將其加密,並在向瀏覽器來回傳送資訊時使用 Secure Sockets Layer (SSL) 加密資訊。
拒絕服務
拒絕服務攻擊是故意造成應用程式的可用性降低,使其無法達到其應有的水準。典型的範例為將 Web 應用程式多載,使它無法為一般使用者服務。或者,惡意使用者可能試圖損毀您的伺服器。
IIS 可供您壓制應用程式,代表它可限制對要求提供服務的數目。您可能可以拒絕已知為惡意的使用者或 IP 位址的存取。將應用程式保持在線上意味著要執行穩固的程式碼。應該徹底測試應用程式,在可行的範圍內適當地回應錯誤狀況。
提高權限
提高權限攻擊是指使用惡意的手段,取得超出一般所指派的權限。例如,在成功的提高權限攻擊中,惡意使用者能夠取得 Web 伺服器的管理權限,這會使他們能夠存取伺服器上的任何資料,並取得對伺服器功能的控制權。
若要防範提高權限的攻擊,可行的話,將應用程式以最小的權限內容執行。例如,建議您不要以系統 (系統管理員) 使用者的身分執行 ASP.NET 應用程式。
概念