我有一个遗留的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及更高版本上不受支持。所以降级并不是一个真正的选择。
答案 0 :(得分:5)
您正在寻找的可能是“持久安全信息”属性。该属性记录为here和here(假设您正在使用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