ADO Connection.ConnectionString不再返回凭据

时间:2013-01-23 20:29:42

标签: sql-server asp-classic ado

我有一个遗留的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及更高版本上不受支持。所以降级并不是一个真正的选择。

1 个答案:

答案 0 :(得分:5)

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

我只找到一个blog post(但没有官方文档),指出此属性的默认值在Windows Vista上从True更改为False,这与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