连接字符串的格式是使用分号分隔的键/值参数对列表:
keyword1=value; keyword2=value
忽略空格,关键字不区分大小写,尽管值可能会区分大小写,这取决于数据源的大小写。要加入包含分号、单引号或双引号的值,值必须加双引号。
连接字符串中 Persist Security Info 关键字的默认设置为 false。
Persist Security Info=false;
如果将该关键字设置为 true 或 yes,将允许在打开连接后,从连接中获得涉及安全性的信息(包括用户标识和密码)。如果在建立连接时必须提供用户标识和密码,最安全的方法是在使用信息打开连接后丢弃这些信息,在 Persist Security Info 设置为 false 或 no 时会发生这种情况。当您向不可信的源提供打开的连接,或将连接信息永久保存到磁盘时,这点尤其重要。如果将 Persist Security Info 保持为 false,可帮助确保不可信的源无法访问连接中涉及安全性的信息,并帮助确保任何涉及安全性的信息都不会随连接字符串信息在磁盘上持久化。
我们建议您使用 Windows 身份验证(通常称为集成安全性)连接到服务器数据库上。要指定 Windows 身份验证,可以对 SQL Server .NET Framework 数据提供程序使用下列两个键/值对中的任意一个:
Integrated Security=true; Integrated Security=SSPI;
但是,只有第二个将适用于 OleDb .NET Framework 数据提供程序。为 ConnectionString 设置 Integrated Security=true 将引发异常。
对于 ODBC .NET Framework 数据提供程序,必须使用以下键/值对指定 Windows 身份验证。
Trusted_Connection=yes;
每个 .NET Framework 数据提供程序提供一个从 DbConnectionStringBuilder 继承的强类型连接字符串生成器类。连接字符串生成器使开发人员可以通过编程,基于用户输入创建语法正确的连接字符串,以及分析并重新生成现有的连接字符串。有关更多信息,请参见
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
SqlConnectionStringBuilder
在设计时或运行时生成连接字符串会复杂一些。有可能难以记住希望使用的连接字符串选项名称;也有可能难以确定如何分隔其取值;也有可能正在寻求帮助,以确保从用户接收的输入不会改变连接字符串的目的。ADO.NET 2.0引入了连接字符串生成器类,以帮助开发人员解决在生成连接字符串时遇到的这些问题。
连接字符串生成器的使用非常简单。可以通过这个类的索引器来设置和检查值。在提供了希望使用的值之后,就可以使用生成器的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
连接字符串生成器通过将许多常用选项作为属性公开,简化了生成连接字符串的过程。ADO.NET 2.0中可供使用的连接字符串生成器类包括许多强类型属性,其对应于许多可用连接字符串选项。在前面的一个示例中,通过默认的索引器设置了Data Source,Initial Catalog和Integrated Security连接字符串关键字的值。可以通过访问SqlConnectionStringBuilder类的DataSource,InitialCatalog和IntegratedSecurity属性来重新编写此代码。下面是同一示例,只是这一次使用了SqlConnectionStringBuilder的属性。
bldr.DataSource = @".\SQLExpress";
bldr.InitialCatalog = "Northwind";
bldr.IntegratedSecurity = true;
此代码仍然生成相同的连接字符串,但此代码的编写更容易一些。另外,如果在提供连接字符串关键字时产生了输入错误,将会产生一个编译时错误。如果正在Microsoft Visual Studio中编写代码,并且难以记住连接字符串选项,那么可以很容易地通过IntelliSense下拉菜单使用SqlConnectionStringBuilder中的可用选项。使用这些下拉菜单还可以减少输入字符,防止出现一些输入错误,在其他情况下,需要到测试代码时才能发现这些错误。
使用连接字符串生成器的一个间接好处是:不必再记忆如何分析、转义或分隔连接字符串中的值。假定需要提供一个包括空格的连接字符串值,是否需要在关键字两侧加引号呢?用大括号?一个也不用?还是用两个?
如果以手动方式生成连接字符串,那么这些问题不存在简单的答案。事实上,其答案取决于所使用的.NET数据提供程序。过去使用过ODBC的开发人员可能还会记得:包含空间的ODBC驱动程序名称必须用大括号分隔:"Driver={SQL Server}"。利用连接字符串生成器来代替手动方式生成连接字符串,就不再为这些问题而费心。
如果正在使用连接字符串生成器,可以将逻辑交给生成器处理。例如,可能希望使用连接字符串选项以连接到服务器,并在过程中附加一个数据库文件。希望使用的文件可能在路径中包含空格或其他字符。开发人员不必担心是否或如何分隔连接字符串中的文件名称,只需要使用SqlConnectionStringBuilder类来生成连接字符串,如下所示:
bldr.AttachDBFilename = @"C:\My Complex Path\AttachMe.mdf";
//将生成的连接字符串输出到控制台窗口
读者可能出于某种原因而希望了解如何正确分隔连接字符串中的文件名称,那么该代码段生成以下连接字符串:
Data Source=.\SQLExpress;AttachDbFilename="C:\My Complex Path\AttachMe.mdf";
Integrated Security=True
在编写安全代码时,最重要的规则之一就是“绝对不要盲目相信用户输入”。参数化查询(这一主题将在第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数据提供程序是否正确呢?开发人员能够做些什么呢?
幸运的是,连接字符串生成器可以帮助开发人员处理来自恶意或恶作剧用户的输入。
利用SqlConnectionStringBuilder重新编写前面的代码段,得到以下代码:
bldr.UserID = txtUserID.Text;
bldr.Password = txtPassword.Text;
通过利用具有如图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 本地实例的连接字符串。
<connectionStrings> <add name="DatabaseConnection" connectionString="Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local);" providerName="System.Data.SqlClient" /> </connectionStrings>
System.Configuration 命名空间提供使用配置文件中存储的配置信息的类。ConnectionStringSettings 类具有两个属性,映射到上面所示的 <connectionStrings> 示例部分中显示的名称。
连接字符串。
<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); } } }
SqlConnection 的 ConnectionString 属性可以为 SQL Server 7.0 或更高版本的数据库获取或设置连接字符串。如果需要连接到早期版本的 SQL Server,必须使用 OleDb .NET 数据提供程序。
连接到 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。
要连接到 SQL Server 2000 或更高版本的命名实例,请使用 server name\instance name 语法。
Server=MySqlServer\MSSQL1;"
使用此语法通过 IP 地址连接,其中的网络库为 Win32 Winsock TCP/IP,1433 为正在使用的端口(默认值)。
Network Library=dbmssocn;Data Source=000.000.000.000,1433;
SQL Server 在建立连接时允许使用下列网络库。
Win32 命名管道
Win32 Winsock TCP/IP
Win32 SPX/IPX
Win32 Banyan Vines
Win32 多重协议 (Windows RPC)
通过 OleDbConnection 的 ConnectionString 属性可以为 OLE DB 数据源(例如 Microsoft Access 或 SQL Server 6.5 或更低版本)获取或设置连接字符串。对 SQL Server 7.0 或更高版本使用 SqlConnection。
必须为 OleDbConnection 连接字符串指定提供程序名称。以下连接字符串使用 Jet 提供程序连接到 Microsoft Access 数据库。注意,如果数据库未受保护(默认设置),UserID 和 Password 关键字是可选的。
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\Northwind.mdb;User ID=Admin;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 关键字。
Provider=sqloledb;Data Source=MySqlServer;Initial Catalog=pubs;User Id=*****;Password=*****;
可以在通用数据链接 (UDL) 文件中提供 OleDbConnection 的连接信息;但是,应避免这样做。UDL 文件未加密,会以明文的形式公开连接字符串信息。因为 UDL 文件对应用程序来说是基于外部文件的资源,所以,无法使用 .NET Framework 保护其安全。
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 所需的双引号必须还要加双引号。
在使用 Microsoft Data Shape 提供程序时,应同时使用 Provider 和 Data Provider 关键字。以下示例使用 Shape 提供程序连接到 SQL Server 的本地实例。
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=(local);Initial Catalog=pubs;Integrated Security=SSPI;"
OdbcConnection 的 ConnectionString 属性可以为 OLE DB 数据源获取或设置连接字符串。以下连接字符串使用 Microsoft 文本驱动程序。
Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=d:\bin
有关 ODBC 连接字符串语法的更多信息,请参见 ConnectionString。
OracleConnection 的 ConnectionString 属性可以为 OLE DB 数据源获取或设置连接字符串。
Data Source=Oracle9i;User ID=*****;Password=*****;
引用《ADO.NET 2.0技术内幕 》
posted on 2011-09-08 09:46 SkyDream 阅读(1361) 评论(0) 编辑 收藏 所属分类: ASP.NET
Powered by: BlogJava Copyright © SkyDream