使用連接字符串
有關 .NET 數據提供程序的連接字符串關鍵字的更多信息,請參見ConnectionString連接字符串關鍵字
有關 .NET 數據提供程序的連接字符串關鍵字的更多信息,請參見ConnectionString持續安全信息
連接字符串中 Persist Security Info 關鍵字的默認設置為 false。
如果將該關鍵字設置為 true 或 yes,將允許在打開連接后,從連接中獲得涉及安全性的信息(包括用戶標識和密碼)。如果在建立連接時必須提供用戶標識和密碼,最安全的方法是在使用信息打開連接后丟棄這些信息,在 Persist Security Info 設置為 false 或 no 時會發生這種情況。當您向不可信的源提供打開的連接,或將連接信息永久保存到磁盤時,這點尤其重要。如果將 Persist Security Info 保持為 false,可幫助確保不可信的源無法訪問連接中涉及安全性的信息,并幫助確保任何涉及安全性的信息都不會隨連接字符串信息在磁盤上持久化。
使用 Windows 身份驗證
我們建議您使用 Windows 身份驗證(通常稱為集成安全性)連接到服務器數據庫上。要指定 Windows 身份驗證,可以對 SQL Server .NET Framework 數據提供程序使用下列兩個鍵/值對中的任意一個:
但是,只有第二個將適用于 OleDb .NET Framework 數據提供程序。為 ConnectionString 設置 Integrated Security=true 將引發異常。
對于 ODBC .NET Framework 數據提供程序,必須使用以下鍵/值對指定 Windows 身份驗證。
創建連接字符串
每個 .NET Framework 數據提供程序提供一個從 DbConnectionStringBuilder 繼承的強類型連接字符串生成器類。連接字符串生成器使開發人員可以通過編程,基于用戶輸入創建語法正確的連接字符串,以及分析并重新生成現有的連接字符串。有關更多信息,請參見
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
連接字符串生成器簡介
在設計時或運行時生成連接字符串會復雜一些。有可能難以記住希望使用的連接字符串選項名稱;也有可能難以確定如何分隔其取值;也有可能正在尋求幫助,以確保從用戶接收的輸入不會改變連接字符串的目的。ADO.NET 2.0引入了連接字符串生成器類,以幫助開發人員解決在生成連接字符串時遇到的這些問題。
1. 使用連接字符串生成器
連接字符串生成器的使用非常簡單。可以通過這個類的索引器來設置和檢查值。在提供了希望使用的值之后,就可以使用生成器的ConnectionString屬性來訪問所得到的連接字符串。
這里給出一個例子,在此例中希望基于各種連接字符串選項生成一個連接字符串,并對其進行修改,以使用SqlConnectionStringBuilder(它是SqlConnection對象的一個連接字符串生成器類)。我們只是通過索引器設置不同關鍵字的值。在生成需要的連接字符串之后,訪問ConnectionString屬性,并將結果傳遞給SqlConnection對象,如以下代碼段所示:
bldr["Data Source"] = @".\SQLExpress";
bldr["Initial Catalog"] = "Northwind";
bldr["Integrated Security"] = true;
//將所生成的連接字符串輸出到控制臺窗口
Console.WriteLine("Resulting connection string: {0}", bldr.ConnectionString);
//以SqlConnection使用所生成的連接字符串
SqlConnection cn = new SqlConnection(bldr.ConnectionString);
cn.Open();
將會看到輸出到控制臺窗口的連接字符串如下所示:
Data Source=.\SQLExpress;Initial Catalog=Northwind;Integrated Security=True
2. 連接字符串和IntelliSense
連接字符串生成器通過將許多常用選項作為屬性公開,簡化了生成連接字符串的過程。ADO.NET 2.0中可供使用的連接字符串生成器類包括許多強類型屬性,其對應于許多可用連接字符串選項。在前面的一個示例中,通過默認的索引器設置了Data Source,Initial Catalog和Integrated Security連接字符串關鍵字的值。可以通過訪問SqlConnectionStringBuilder類的DataSource,InitialCatalog和IntegratedSecurity屬性來重新編寫此代碼。下面是同一示例,只是這一次使用了SqlConnectionStringBuilder的屬性。
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
bldr.DataSource = @".\SQLExpress";
bldr.InitialCatalog = "Northwind";
bldr.IntegratedSecurity = true;
//將所生成的連接字符串輸出到控制臺窗口
Console.WriteLine("Resulting connection string: {0}", bldr.ConnectionString);
//以SqlConnection使用所生成的連接字符串
SqlConnection cn = new SqlConnection(bldr.ConnectionString);
cn.Open();
連接字符串生成器通過將許多常用選項作為屬性公開,簡化了生成連接字符串的過程。ADO.NET 2.0中可供使用的連接字符串生成器類包括許多強類型屬性,其對應于許多可用連接字符串選項。在前面的一個示例中,通過默認的索引器設置了Data Source,Initial Catalog和Integrated Security連接字符串關鍵字的值。可以通過訪問SqlConnectionStringBuilder類的DataSource,InitialCatalog和IntegratedSecurity屬性來重新編寫此代碼。下面是同一示例,只是這一次使用了SqlConnectionStringBuilder的屬性。
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
bldr.DataSource = @".\SQLExpress";
bldr.InitialCatalog = "Northwind";
bldr.IntegratedSecurity = true;
//將所生成的連接字符串輸出到控制臺窗口
Console.WriteLine("Resulting connection string: {0}", bldr.ConnectionString);
//以SqlConnection使用所生成的連接字符串
SqlConnection cn = new SqlConnection(bldr.ConnectionString);
cn.Open();
此代碼仍然生成相同的連接字符串,但此代碼的編寫更容易一些。另外,如果在提供連接字符串關鍵字時產生了輸入錯誤,將會產生一個編譯時錯誤。如果正在Microsoft Visual Studio中編寫代碼,并且難以記住連接字符串選項,那么可以很容易地通過IntelliSense下拉菜單使用SqlConnectionStringBuilder中的可用選項。使用這些下拉菜單還可以減少輸入字符,防止出現一些輸入錯誤,在其他情況下,需要到測試代碼時才能發現這些錯誤。
3. 處理復雜的連接字符串選項值
使用連接字符串生成器的一個間接好處是:不必再記憶如何分析、轉義或分隔連接字符串中的值。假定需要提供一個包括空格的連接字符串值,是否需要在關鍵字兩側加引號呢?用大括號?一個也不用?還是用兩個?
如果以手動方式生成連接字符串,那么這些問題不存在簡單的答案。事實上,其答案取決于所使用的.NET數據提供程序。過去使用過ODBC的開發人員可能還會記得:包含空間的ODBC驅動程序名稱必須用大括號分隔:"Driver={SQL Server}"。利用連接字符串生成器來代替手動方式生成連接字符串,就不再為這些問題而費心。
如果正在使用連接字符串生成器,可以將邏輯交給生成器處理。例如,可能希望使用連接字符串選項以連接到服務器,并在過程中附加一個數據庫文件。希望使用的文件可能在路徑中包含空格或其他字符。開發人員不必擔心是否或如何分隔連接字符串中的文件名稱,只需要使用SqlConnectionStringBuilder類來生成連接字符串,如下所示:
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
bldr.DataSource = @".\SQLExpress";
bldr.IntegratedSecurity = true;
bldr.AttachDBFilename = @"C:\My Complex Path\AttachMe.mdf";
//將生成的連接字符串輸出到控制臺窗口
Console.WriteLine("Resulting connection string: {0}", bldr.ConnectionString);
//以SqlConnection使用所生成的連接字符串
SqlConnection cn = new SqlConnection(bldr.ConnectionString);
cn.Open();
讀者可能出于某種原因而希望了解如何正確分隔連接字符串中的文件名稱,那么該代碼段生成以下連接字符串:
Data Source=.\SQLExpress;AttachDbFilename="C:\My Complex Path\AttachMe.mdf";
Integrated Security=True
4. 惡意連接字符串輸入,也稱為“連接字符串注入”
在編寫安全代碼時,最重要的規則之一就是“絕對不要盲目相信用戶輸入”。參數化查詢(這一主題將在第4章中詳細討論)非常有用,其原因有很多,但重要原因之一是它可以防止SQL注入。可以構建一個參數化查詢,并為參數指定由用戶提供的取值,而不必擔心用戶輸入是否會改變查詢的結構。在生成連接字符串時也存在類似問題。
您可能決定對用戶進行提示,使其輸入憑據——提供一個文本框以允許用戶輸入用戶名和密碼,然后利用以下代碼,基于連接字符串中的輸入來構造連接字符串。
string strConn;
strConn = @"Data Source=.\SQLExpress;Initial Catalog=Northwind;" +
"User ID=" + txtUserID.Text + ";" +
"Password=" + txtPassword.Text + ";"
Console.WriteLine("Resulting connection string: {0}", strConn);
乍看起來,這似乎是安全而符合邏輯的。現在假定有一位惡意用戶,他希望修改此連接字符串。圖3.1說明了一種方式,這種惡意用戶可以采用這種方式來修改要訪問哪個服務器。由于沒有更好的術語,我們將這種方法稱為“連接字符串注入”。
圖3.1 惡意用戶嘗試通過用戶輸入改變應用程序訪問的服務器
利用以上代碼段和如圖3.1所示的輸入,所得到的連接字符串如下所示:
Data Source=.\SQLExpress;Initial Catalog=Northwind;User ID=MyUserID;
Data Source=EvilServerName;Password=MyPassword;
可以看到,Data Source被指明兩次。在使用所得到的連接字符串時,會選用哪個值呢?是第一個(本地計算機),還是第二個(“evil”服務器)?是否存在手動檢查用戶輸入的方式,以檢查諸如此類的可能的連接字符串注入?這些答案對于其他連接字符串關鍵字或其他.NET數據提供程序是否正確呢?開發人員能夠做些什么呢?
幸運的是,連接字符串生成器可以幫助開發人員處理來自惡意或惡作劇用戶的輸入。
5. 用連接字符串生成器防止連接字符串注入
利用SqlConnectionStringBuilder重新編寫前面的代碼段,得到以下代碼:
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
bldr.DataSource = @".\SQLExpress";
bldr.InitialCatalog = "Northwind";
bldr.UserID = txtUserID.Text;
bldr.Password = txtPassword.Text;
Console.WriteLine("Resulting connection string: {0}", bldr.ConnectionString);
通過利用具有如圖3.1所示惡意輸入的SqlConnectionStringBuilder(對于用戶名使用"MyUserID;Data Source=EvilServerName",對于密碼使用MyPassword),將會生成以下連接字符串。
Data Source=.\SQLExpress;Initial Catalog=Northwind;
User ID="MyUserID;Data Source=EvilServerName";Password=MyPassword
注意,User ID關鍵字的值被分隔。這會導致ADO.NET嘗試以“MyUserID;Data Source=EvilServerName”為User ID來登錄到SQL Server數據庫。
存儲和檢索連接字符串
我們建議您不要在代碼中嵌入連接字符串。如果服務器的位置會更改,您的應用程序將需要重新編譯。此外,編譯成應用程序源代碼的未加密連接字符串可以使用 MSIL 反匯編程序 (ildasm.exe) 查看。
將連接字符串存儲在配置文件中
為了避免將連接字符串存儲在代碼中,可以將代碼存儲在 ASP.NET 應用程序的 web.config 文件中以及 Windows 應用程序的 app.config 文件中。
連接字符串可以存儲在配置文件的 <connectionStrings> 元素中。連接字符串存儲為鍵/值對的形式,可以在運行時使用名稱查找存儲在 connectionString 屬性中的值。以下配置文件示例顯示名為 DatabaseConnection 的連接字符串,該連接字符串引用連接到 SQL Server 本地實例的連接字符串。
從配置文件中檢索連接字符串
System.Configuration 命名空間提供使用配置文件中存儲的配置信息的類。ConnectionStringSettings 類具有兩個屬性,映射到上面所示的 <connectionStrings> 示例部分中顯示的名稱。
- ConnectionString
連接字符串。
- Name
<connectionStrings> 部分的連接字符串的名稱。
可以使用受保護的配置可選地加密配置文件中存儲的連接字符串。請參見使用受保護的配置加密配置信息、對配置節進行加密和解密和演練:使用受保護的配置加密配置信息。 |
示例
以下示例通過將連接字符串的名稱傳遞給 ConfigurationManager,再由其返回 ConnectionStringSettings 對象,以便從配置文件中檢索連接字符串。ConnectionString 屬性用于顯示此值。
using System; using System.Configuration; class Program { static void Main() { ConnectionStringSettings settings; settings = ConfigurationManager.ConnectionStrings["DatabaseConnection"]; if (settings != null) { Console.WriteLine(settings.ConnectionString); } } }
SqlClient 連接字符串
SqlConnection 的 ConnectionString 屬性可以為 SQL Server 7.0 或更高版本的數據庫獲取或設置連接字符串。如果需要連接到早期版本的 SQL Server,必須使用 OleDb .NET 數據提供程序。
SqlClient 連接字符串語法
連接到 SQL Server 數據庫的語法很靈活。下列每個語法形式均將使用集成安全性連接到本地服務器上的 AdventureWorks 數據庫。始終通過名稱或通過關鍵字(local) 指定服務器。
"Persist Security Info=False;Integrated Security=true;Initial Catalog=AdventureWorks;Server=MSSQL1" "Persist Security Info=False;Integrated Security=SSPI;database=AdventureWorks;server=(local)" "Persist Security Info=False;Trusted_Connection=True;database=AdventureWorks;server=(local)"
要強制使用某個協議,請添加下列前綴之一:
np:(local), tcp:(local), lpc:(local)
對于 SQL Server 身份驗證,使用此語法指定用戶名和密碼,其中的星號表示有效的用戶名和密碼。
"Persist Security Info=False;User ID=*****;Password=*****;Initial Catalog=AdventureWorks;Server=MySqlServer"
有關有效的連接字符串關鍵字的完整列表,請參見 ConnectionString。
連接到命名實例
設置網絡庫
OleDb 連接字符串
通過 OleDbConnection 的 ConnectionString 屬性可以為 OLE DB 數據源(例如 Microsoft Access 或 SQL Server 6.5 或更低版本)獲取或設置連接字符串。對 SQL Server 7.0 或更高版本使用 SqlConnection。
OleDb 連接字符串語法
必須為 OleDbConnection 連接字符串指定提供程序名稱。以下連接字符串使用 Jet 提供程序連接到 Microsoft Access 數據庫。注意,如果數據庫未受保護(默認設置),UserID 和 Password 關鍵字是可選的。
如果數據庫受保護,必須提供工作組信息文件的位置。
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\Northwind.mdb;Jet OLEDB:System Database=d:\NorthwindSystem.mdw;User ID=*****;Password=*****;
對于 SQL Server 6.5 或更低版本,請使用 sqloledb 關鍵字。
不要使用通用數據鏈接文件
可以在通用數據鏈接 (UDL) 文件中提供 OleDbConnection 的連接信息;但是,應避免這樣做。UDL 文件未加密,會以明文的形式公開連接字符串信息。因為 UDL 文件對應用程序來說是基于外部文件的資源,所以,無法使用 .NET Framework 保護其安全。
連接到 Excel
Microsoft Jet 提供程序用于連接到 Excel 工作簿。在以下連接字符串中,Extended Properties 關鍵字設置 Excel 特定的屬性。“HDR=Yes;”指示第一行中包含列名,而不是數據,“IMEX=1;”通知驅動程序始終將“互混”數據列作為文本讀取。注意
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""
注意,Extended Properties 所需的雙引號必須還要加雙引號。
Data Shape 提供程序連接字符串語法
Odbc 連接字符串
OdbcConnection 的 ConnectionString 屬性可以為 OLE DB 數據源獲取或設置連接字符串。以下連接字符串使用 Microsoft 文本驅動程序。
有關 ODBC 連接字符串語法的更多信息,請參見 ConnectionString。
Oracle 連接字符串
OracleConnection 的 ConnectionString 屬性可以為 OLE DB 數據源獲取或設置連接字符串。
有關 ODBC 連接字符串語法的更多信息,請參見 ConnectionString。
posted on 2011-09-08 09:46 SkyDream 閱讀(1368) 評論(0) 編輯 收藏 所屬分類: ASP.NET