sql-server - 如何保护 Excel VBA 项目中的 ADO 连接?

标签 sql-server excel vba security ado

我有一个 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 用户名和密码安全并防止第三方获取它们?对 VBA 项目进行密码保护是否足够,或者是否可以轻松破解?

最佳答案

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

关于sql-server - 如何保护 Excel VBA 项目中的 ADO 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41097640/

相关文章:

mysql - TimeZoneInfo.ConvertTimeToUtc() 的日期时间错误

xml - 哪个是真正的 XMLSS?

arrays - 检查数组的所有元素是否相同

vba - 在 Excel 公式中返回 .cells 范围

PHPExcel 文件格式或扩展名无效 2

vba - 如何更新/更改所有条件规则范围的最后一行

vba - 使用 VBA 选择 Excel 表(不是工作表)上的所有行

sql-server - Polybase CREATE EXTERNAL TABLE 跳过 header

sql-server - 如何将 Azure SQL 数据库文件移动到不同位置?

sql-server - SQL Server : cannot create a linked server, 说它已经存在