【问题标题】:How to secure connection between Vb6 application and mssql server?如何保护 Vb6 应用程序和 mssql 服务器之间的连接?
【发布时间】:2019-02-27 10:08:07
【问题描述】:

我正在开发一个遗留应用程序,它使用 sqloledb 提供程序和 activex 数据对象连接到 mssql 数据库。现在我需要加密应用程序和服务器之间的连接,而无需在 sql server 中强制加密选项。

我在 sql server 实例中安装了自签名证书,并尝试将 Encrypt=trueTrustservercertificate=true 放入连接字符串。但是连接没有加密。

我已尝试将 ODBC 提供程序与 ADO 一起使用,并且在使用 encrypt=truetrustservercertificate=true 时,我收到了打开连接的 SSL 安全错误。

请告诉我如何使用 ADO 2.8 库建立安全连接。

Private Sub Command1_Click()
    Dim sConnectionString As String
    Dim strSQLStmt As String

     '-- Build the connection string
     'sConnectionString = "UID=userid;PWD=password;Initial Catalog=EHSC_SYM_Kings_Development;Server=EHILP-257\MIB14;Provider=MSOLEDBSQL;Encrypt=YES;trustServerCertificate=YES"
     'sConnectionString = "Provider=sqloledb;Data Source=192.168.27.91\MIB14;Initial Catalog=EHSC_SYM_Kings_Development;User Id=userid;Password=password;Encrypt=YES;trustServerCertificate=YES"
     'sConnectionString = "driver={SQL Server};server=192.168.27.91\MIB14;user id=userid;password=password;Initial Catalog=EHSC_SYM_Kings_Development;Encrypt=Yes;trustServerCertificate=True"
     sConnectionString = "Provider=SQLNCLI11;Server=192.168.27.91\MIB14;Database=EHSC_SYM_Kings_Development;Uid=userid;Pwd=password;Encrypt=yes;trustServerCertificate=True"

     strSQLStmt = "select * from dbo.patient where pat_pid = '1001'"

    'DB WORK
    Dim db As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim rs As New ADODB.Recordset
    Dim result As String

    db.ConnectionString = sConnectionString
    db.Open 'open connection

    With cmd
      .ActiveConnection = db
      .CommandText = strSQLStmt
      .CommandType = adCmdText
    End With

    With rs
      .CursorType = adOpenStatic
      .CursorLocation = adUseClient
      .LockType = adLockOptimistic
      .Open cmd
    End With

    If rs.EOF = False Then
        rs.MoveFirst
        Let result = rs.Fields(0)
    End If
    'close conns
    rs.Close
    db.Close
    Set db = Nothing
    Set cmd = Nothing
    Set rs = Nothing
End Sub

【问题讨论】:

  • 您不能使用SQLNCLI11 提供程序吗?然后docs.microsoft.com/en-us/dotnet/framework/data/adonet/… 应该适用。
  • 我尝试过使用 ado.net,但这不是一个 activex 组件,所以我需要在 ado.net 周围创建一个 activex 包装器才能在我的 vb6 应用程序中使用它。我的应用程序仍然使用 ado.recordset 而 ado.net 使用数据集。所以将数据集转换为记录集是一种性能开销,所以我不能使用 ado.net。
  • SQLNCLI11 可以在 ADO 2.8 中正常工作,您只需在连接字符串中指定它 - connectionstrings.com/…
  • 这是我尝试过的事情之一。它不起作用。我添加了我尝试过的东西的示例。
  • @SaiManibalan,ADO 是一个 ActiveX 组件,SQLNCLI 是 ADO 使用的 OLE DB 提供程序。确保您使用的是native client version that supports TSL 1.2。您可以考虑使用较新的msoledbsql provider instead

标签: sql-server vb6 ado


【解决方案1】:

感谢大家的建议,我终于通过将驱动程序更改为sqlserver native client 11(ODBC)来确保连接安全。看起来 sqloledb 不支持 tls。将驱动程序更改为 ODBC 似乎并没有太大改变行为。我的其余代码无需任何更改即可正常工作

sConnectionString = "Driver={SQL Server Native Client 11.0};Server=192.168.27.91\MIB14;Database=xxxxxxxx;user id=xxxxxxx;password=xxxxxxxxx;Encrypt=yes;TrustServerCertificate=yes"

【讨论】:

  • 注意:删除或屏蔽您的密码(假设是真实的)。
【解决方案2】:

我自己刚刚经历过。

对于您的原始连接字符串,您要查找的关键字是not“Encrypt=true”或“Encrypt=yes”,就像大多数互联网会让您相信的那样。它是“对数据使用加密=true”。

所以你的连接字符串变成:

sConnectionString = "Provider=SQLNCLI11;Server=192.168.27.91\MIB14;Database=EHSC_SYM_Kings_Development;Uid=userid;Pwd=password;Use Encryption for Data=true;trustServerCertificate=True"

trustservercertificate=true 仅用于使用自签名证书进行测试...并将自己暴露于中间人攻击;)

作为参考,这是通过以下方式测试的: VB6 通过 ADODB 使用 SQLNCLI11 提供程序连接到 SQL Server 2016。

【讨论】:

    猜你喜欢
    • 2022-09-30
    • 2011-05-27
    • 2018-03-21
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多