【问题标题】:How to secure an ADO connection in an Excel VBA project?如何保护 Excel VBA 项目中的 ADO 连接?
【发布时间】:2016-12-12 09:25:14
【问题描述】:

我有一个 Excel 电子表格 (.xlsb),它通过 VBA 中的 ActiveX 数据对象 (ADO) 连接到 SQL Server,我必须与一群人共享它。代码使用以下字符串连接数据库:

' Create the connection string.
sConnString = "Provider=SQLOLEDB;" & _
              "Data Source={server name};" & _
              "Initial Catalog={database name};" & _
              "UserId={username};" & _
              "Password={password};"

如何确保我的 SQL 用户名和密码安全并防止第 3 方访问它们?密码保护 VBA 项目是否足够,还是很容易破解?

【问题讨论】:

  • 您是否考虑过与 DBA 交谈以获得仅提供对用户无论如何都会看到的数据的访问权限的登录?您在数据库中有一个视图和一个只能访问该视图中数据的帐户....
  • 能否根据 SQL Server 中的机器/用户 ID 限制安全性?
  • @RobinMackenzie 我正在使用的帐户是只读的,但我不希望任何人看到登录详细信息。
  • @Nathan_Sav 不幸的是,目前我必须使用共享 sql 帐户。

标签: sql-server excel vba security ado


【解决方案1】:

VBA 项目没有受到足够的保护 - 任何有 2 小时空闲时间和互联网的人都可以通过。

基本情况是在数据库级别使不同的用户具有不同的权限。然后要求 Excel 电子表格上的用户在其中一个单元格中或通过用户表单提供密码和用户名。获取密码和用户名并在连接字符串中使用。

作为安全的进一步措施,您可以使用一个小技巧,我称之为salting。例如。假设给定用户的密码是vityata。然后要求用户输入。输入后,获取密码并将其更改为其他密码。这应该是数据库的密码。我的意思是这样的:

Public Function str_generator(ByVal str_value As String, ByVal b_fix As Boolean) As String

    Dim l_counter As Long
    Dim l_number As Long
    Dim str_char As String

    On Error GoTo str_generator_Error

    If b_fix Then
        str_value = Left(str_value, Len(str_value) - 1)
        str_value = Right(str_value, Len(str_value) - 1)
    End If

    For l_counter = 1 To Len(str_value)
        str_char = Mid(str_value, l_counter, 1)
        If b_is_odd(l_counter) Then
            l_number = Asc(str_char) + IIf(b_fix, -2, 2)
        Else
            l_number = Asc(str_char) + IIf(b_fix, -3, 3)
        End If

        str_generator = str_generator + Chr(l_number)

    Next l_counter

    If Not b_fix Then
        str_generator = Chr(l_number) & str_generator & Chr(l_number)
    End If

    On Error GoTo 0
    Exit Function

str_generator_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure str_generator of Function Modul1"

End Function

Private Function b_is_odd(l_number As Long) As Boolean

    b_is_odd = l_number Mod 2

End Function

假设用户密码是vityata。然后用户输入后改成cxlv|cwcc,这就是数据库的真实密码。

?str_generator("vityata",false)
cxlv|cwcc
?str_generator("cxlv|cwcc",true)
vityata

【讨论】:

  • 不错的代码 - 但我可以访问它然后我可以反解密码...
  • 这是 100% 正确的。但至少你不要把密码放在纯文本中。
  • 通过默默无闻的安全性 - 但如果他的数据库有核密码怎么办?
  • 嗯,这就是为什么每个用户都应该通过 Excel 表手动输入自己的密码。然后,使用这个密码,我们连接到数据库。 100% 安全,如果我们不将密码保存在任何地方。
  • 我可以看到类似这样的东西用于根据用户的 Windows 用户名生成密码。这样,我将拥有一个 main 密码,并从主密码生成单独的密码,并考虑用户名,仅适用于我想授予访问权限的人。好主意,谢谢!
【解决方案2】:

VBA 密码保护不能被认为是安全的,因为它很容易被绕过。

您当然可以在 VBA 代码中添加某种混淆(哈希函数或类似函数),这样密码在纯文本中不可见,但任何熟悉 VBA 的人都应该能够很快解决这个问题时间。

我会考虑使用仅包含所需数据的视图来限制对数据库的访问。

可以通过将连接功能放入 dll 中来隐藏密码,然后您可以在 VBA 代码中引用该 dll。这将需要更多的工作来扭转,并为您提供更多真正隐藏凭据的可能性。另请参阅此回复:https://stackoverflow.com/a/19163256/5970009

【讨论】:

  • 没有考虑将连接功能放在 dll 中。这看起来很有希望;我会调查的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
相关资源
最近更新 更多