ASP.NET中数据库连接字符串的若干问题

问题1、连接字符串的存储

通常为了程序的可移植性和通用性,数据库连接字符串一般存储在Web.config文件中,但是在VS.NET 2003和VS 2005中的存储位置有所不同。

在VS.NET 2003中:

<configuration>

<appSettings>

<add key="ConnectionString" value="server=localhost;u />

</appSettings>

<configuration>

在VS 2005中:

<connectionStrings>

<add name="DMConnection" connectionString="server=loaclhost;database=AdventureWorksDW;u />

</connectionStrings>

问题2、连接字符串的加密

为了安全方面的考虑,连接字符串最好采用加密的方式存储在web.config文件中,这样就算web服务器被黑,也可以保证数据库服务器的安全性。

这里主要针对ASP.NET 2.0下的WEB.CONFIG文件的加密。例如,未加密的配置文件中可能包含一个指定用于连接到数据库的连接字符串的节,如下面的示例所示:

<configuration>

<connectionStrings>

<add name="SampleSqlServer" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />

</connectionStrings>

</configuration>

ASP.NET 2.0 中有一个新的安全特性.可以对 Web.config 文件中的任何配置节进行加密处理,可以通过手工运行工具aspnet_regiis或者编程来完成这个工作。如果你可以直接访问你的Web 服务器,你可以通过运行如下的命令行:

cd %windows%\Microsoft.NET\Framework\versionNumber

aspnet_regiis -pe "connectionStrings" -app "/SampleApplication" –prov RsaProtectedConfigurationProvider

-pd section

对配置节进行解密。此参数采用下面的可选参数:

· -app virtualPath 指定应该在包含路径的级别进行解密。

· -location subPath 指定要解密的子目录。

· -pkm 指定应该对 Machine.config 而非 Web.config 文件进行解密。

-pdf section webApplicationDirectory

对指定物理(非虚拟)目录中的 Web.config 文件的指定配置节进行解密。

-pe section

对指定的配置节进行加密。此参数采用下面的可选修饰符:

· -prov provider 指定要使用的加密提供程序。

· -app virtualPath 指定应该在包含路径的级别进行加密。

· -location subPath 指定要加密的子目录。

· -pkm 指定应该对 Machine.config 而非 Web.config 文件进行加密。

-pef section webApplicationDirectory

对指定物理(非虚拟)目录中的 Web.config 文件的指定配置节进行加密。

如果你是使用虚拟主机等不能访问物理的服务器,你仍然能够通过编程方式加密的连接字符串:

1 Configuration config = Configuration.GetWebConfiguration(Request.ApplicationPath);

2 ConfigurationSection section = config.Sections["connectionStrings"];

3 section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");;

4 config.Update ();

现在, 使用受保护配置对连接字符串值进行加密的配置文件不以明文形式显示连接字符串,而是以加密形式存储它们,如下面的示例所示:

<configuration>

<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">

<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"

xmlns="http://www.w3.org/2001/04/xmlenc#">

<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />

<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">

<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">

<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />

<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">

<KeyName>RSA Key</KeyName>

</KeyInfo>

<CipherData>

<CipherValue>RXO/zmmy3sR0iOJoF4ooxkFxwelVYpT0riwP2mYpR3FU+r6BPfvsqb384pohivkyNY7Dm4lPgR2bE9F

7k6TblLVJFvnQu7p7d/yjnhzgHwWKMqb0M0t0Y8DOwogkDDXFxs1UxIhtknc+2a7UGtGh6D

i3N572qxdfmGfQc7ZbwNE=

</CipherValue>

</CipherData>

</EncryptedKey>

</KeyInfo>

<CipherData>

<CipherValue>KMNKBuV9nOid8pUvdNLY5I8R7BaEGncjkwYgshW8ClKjrXSM7zeIRmAy/cTaniu8Rfk92KVkEK83

+UlQd+GQ6pycO3eM8DTM5kCyLcEiJa5XUAQv4KITBNBN6fBXsWrGuEyUDWZYm6Eijl8DqRDb

11i+StkBLlHPyyhbnCAsXdz5CaqVuG0obEy2xmnGQ6G3Mzr74j4ifxnyvRq7levA2sBR4lhE5M80Cd5yKEJktcPWZYM

99TmyO3KYjtmRW/Ws/XO3z9z1b1KohE5Ok/YX1YV0+Uk4/yuZo0Bjk+rErG505YMfRVtxSJ4ee418

ZMfp4vOaqzKrSkHPie3zIR7SuVUeYPFZbcV65BKCUlT4EtPLgi8CHu8bMBQkdWxOnQEIBeY+TerAee/SiBCrA8M/n

9bpLlRJkUb+URiGLoaj+XHym//fmCclAcveKlba6vKrcbqhEjsnY2F522yaTHcc1+wXUWqif7rSIPhc0+

MT1hB1SZjd8dmPgtZUyzcL51DoChy+hZ4vLzE=

</CipherValue>

</CipherData>

</EncryptedData>

</connectionStrings>

问题3、ASP.NET的WEB.CONFIG文件的管理

WEB.CONFIG文件可以直接在VS的IDE中打开编辑,当然也有更好的办法进行可视化管理。例如,如果装了IIS,就可以利用ASP.NET MMC来管理,具体方法是在IIS中的虚拟目录属性上选择ASP.NET选项卡,点击“编辑配置”即可。

问题4、连接字符串的读取

在程序中只有通过读取WEB.CONFIG文件中的连接字符串才能获得数据库的连接信息。在VS.NET 2003中,读取方法如下:

string sqlconnstr=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];

在ASP.NET 2.0中,读取方法如下:

方法一:

string myConn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

方法二:

string connString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ConnectionString"].ToString();