ADO Connection.ConnectionString不再返回凭据

Sev*_*yev 2 sql-server ado asp-classic

我有一个遗留的ASP应用程序,我需要在现代服务器上发布.它使用ADO和SQLOLEDB与MS SQL Server通信.它使用用户名和密码登录SQL.

该应用程序依赖于似乎已更改的ADO Connection对象的特殊行为.这些天(在ADODB.Connection.6中),当您向Connection提供连接字符串然后将其检索回来时,您不会获得原始字符串的精确副本; 具体来说,从中删除用户名和密码,并添加一些额外的参数.

看起来旧版本的ADO在这种情况下没有剥离凭证; 如果它应用程序将永远不会工作,它的工作原理.问题 - 这是记录在案的吗?有没有办法在新的ADO中强制执行遗留行为?

我真的不想在共享服务器上降级ADO.

编辑:只是将它隔离到一个最小的测试用例.适用于Windows 2003上的Connection.2.80(msado15.dll v.2.82.5011.0),在Windows 2008上的Connection.6上失败(dll v.6.1.7600.17036).

EDIT2:官方称,旧的MDAC 2.8(ADO是其中的一部分)在Vista及更高版本上不受支持.所以降级并不是一个真正的选择.

Che*_*vel 5

您正在寻找的可能是"持久安全信息"属性.该属性在此处此处记录(假设您使用的是SQLOLEDB提供程序;但我处理过的大多数提供程序在这方面的行为相同).基本上,当此属性设置为时False,敏感信息(如密码)将在读取时从连接字符串中删除.相反,当属性设置为时,True连接字符串将完全按照提供的方式返回(包括任何敏感信息).

我只找到了一个博客帖子(但没有正式文件),指出该属性的默认值从变化TrueFalse在Windows Vista中,这将与Windows Server 2008这是你的观察相符一致.

应该注意的是,新的默认值False被认为更安全,因为意外泄露敏感信息的风险较小.这里推荐的解决方案是重新设计应用程序,以便它不需要依赖从ConnectionString属性中获取密码.

通过该免责声明,您可以通过添加明确地通过连接字符串设置"持久安全信息"属性;Persist Security Info=True.也可以Connection在打开之前设置对象的属性(如果你不能改变连接字符串),但我不完全确定它是否可行(你可能必须先手动设置Provider属性) .

' untested examples

' Method 1
connString = "Provider=SQLOLEDB;"
connString = connString & "Data Source=example;"
connString = connString & "Initial Catalog=exampleDB;"
connString = connString & "User Id=user;"
connString = connString & "Password=1234;"
connString = connString & "Persist Security Info=True"

Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connString

' Method 2
connString = "Data Source=example;"
connString = connString & "Initial Catalog=exampleDB;"
connString = connString & "User Id=user;"
connString = connString & "Password=1234;"

Set conn = Server.CreateObject("ADODB.Connection")
conn.Provider = "SQLOLEDB"
conn.Properties("Persist Security Info").Value = True
conn.Open connString
Run Code Online (Sandbox Code Playgroud)