保護 ADO.NET 連接
處理應用程式安全性的一個最重要的目標就是保護資料來源的存取。若要限制資料來源的存取就一定要保持使用者識別碼 (userid)、密碼、資料來源名稱 (Data Source Name) 等連接資訊的私密性。下列方針可確保重要連接資訊的私密性。
避免將使用者識別碼和密碼存成純文字
以純文字儲存使用者識別碼和密碼會造成嚴重的缺失。如果使用者識別碼和密碼是原始程式碼的一部份,而且原始程式碼曾外洩過,則這兩者將會是致命傷。即使提供外部來源的是程式碼的編譯版本,但它仍可被反組譯,並暴露使用者識別碼和密碼。因此,千萬不要將使用者識別碼和密碼等重要資訊以純文字儲存在程式碼中。
您可以使用加密方式 (請參閱密碼編譯服務) 來保持使用者識別碼和密碼的私密性,但是仍必須小心存放金鑰資訊,將秘密資訊與應用程式分開存放,並以 NTFS 使用權限嚴密保護。
在連接 Microsoft SQL Server 時,您也可以選用整合式安全性 (Integrated Security),它使用與目前使用中使用者的識別 (Identity) 而非使用者識別碼和密碼來控制安全性。. 強力建議您使用整合式安全性。
**注意 **ASP.NET 開發人員使用整合式安全性時必須特別小心。如需控制 ASP.NET 應用程式目前使用中使用者識別的資訊,請參閱ASP.NET 模擬。
保護通用資料連結檔
使用通用資料連結 (Universal Data Link,UDL) 檔案可為 OleDbConnection 提供連接資訊。由於 UDL 檔案對應用程式來說是外部資源,因此應該使用 New Technologies File System (NTFS) 檔案使用權限來保衛連接資訊受到公開或修改,以藉此保護 UDL 檔案。另外,也請提供 UDL 檔案的完整路徑,確保連接使用正確的 UDL 標案。
UDL 檔並未加密。如果您想要以加密方式進一步保護連接資訊的安全性,則不能使用 UDL 檔提供連接字串資訊。
保持 Persist Security Info 為 False
若將 Persist Security Info 設定為 true 或 yes,則開啟連接時,可藉由連接獲得使用者識別碼和密碼等機密資訊。連接時,如果您有提供使用者識別碼和密碼,則為了安全起見,只有在開啟連接時使用該資訊,之後請將它丟棄。因此,提升安全性的做法就是將 Persist Security Info 設定為 false 或 no。
如果您開啟不信任來源的連接或將連接資訊保存到磁碟,這點就更重要了。保持 Persist Security Info 為 false 有助於確保不信任來源無法存取連接的機密資訊,同時也能確保機密資訊不會與連接字串資訊一起存到磁碟上。
Persist Security Info 預設值為 false。
從使用者輸入建構連接字串時的注意事項
如果您是從外部來源取得連接字串資訊 (例如使用者提供使用者識別碼和密碼),則必須注意,不要在建構連接的字串值中包含會變更連接行為的額外連接字串參數。若要保持連接字串的安全,請驗證任何外部來源的輸入,確保它的格式正確。
驗證輸入
您可使用規則運算式來驗證輸入是否符合特定的格式。.NET Framework 提供 Regex 物件來驗證輸入值與規則運算式是否相符。例如,下列程式碼可確保使用者識別碼值是由 8 個英數字元所組成的字串。
Public Static Function ValidateUserid(inString As String) As Boolean
Dim r As Regex = New Regex("^[A-Za-z0-9]{8}$")
Return r.IsMatch(inString)
End Function
[C#]
public static bool ValidateUserid(string inString)
{
Regex r = new Regex("^[A-Za-z0-9]{8}$");
return r.IsMatch(inString)
}