2

我有一个需要在现代服务器上发布的旧版 ASP 应用程序。它使用带有 SQLOLEDB 的 ADO 与 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:正式地,ADO 所属的旧 MDAC 2.8 在 Vista 和更高版本上不受支持。所以降级并不是一个真正的选择。

4

1 回答 1

5

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

我只发现一篇文(但没有官方文档)指出此属性的默认值在 Windows Vista 中从 更改为TrueFalse这与 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
于 2013-01-24T03:42:21.977 回答