2016-12-12 8 views
2

Ich habe eine Excel-Tabelle (.xlsb), die über ActiveX Data Objects (ADO) in VBA eine Verbindung zu einem SQL Server herstellt, die ich mit einer Menge Leute teilen muss. Der Code verwendet die folgende Zeichenfolge mit der Datenbank zu verbinden tun:Wie sichere eine ADO-Verbindung in einem Excel VBA-Projekt?

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

Wie halte ich meine SQL-Benutzername und Passwort sichern und 3.e Parteien verhindern, dass der Zugang zu ihnen zu gewinnen? Ist das VBA-Projekt passwortgeschützt oder kann es leicht geknackt werden?

+0

Haben Sie darüber nachgedacht, mit dem DBA für eine Anmeldung zu sprechen, die nur Zugriff auf die Daten bietet, die die Benutzer trotzdem sehen? Sie haben eine Sicht in der Datenbank und ein Konto, das nur auf die Daten in dieser Sicht zugreifen kann. –

+0

Können Sie die Sicherheit basierend auf der Rechner-/Benutzer-ID in SQL Server einschränken? –

+0

@RobinMackenzie das Konto, das ich bereits verwende, ist schreibgeschützt, aber ich möchte nicht, dass jemand die Anmeldedaten sieht. –

Antwort

2

VBA-Projekt ist nicht geschützt genug - jeder mit 2 Stunden Freizeit und Internet kann wahrscheinlich durchlaufen.

In einem Basisszenario werden verschiedene Benutzer auf DB-Ebene mit unterschiedlichen Berechtigungen eingerichtet. Bitten Sie dann Ihre Benutzer in der Excel-Tabelle, das Kennwort und den Benutzernamen in einer der Zellen oder über das Benutzerformular anzugeben. Nimm das Passwort und den Benutzernamen und verwende es in der Verbindungszeichenfolge.

Als weiteren Schritt zur Sicherheit können Sie einen kleinen Trick verwenden, den ich salting anrufen. Z.B. Nehmen wir an, Ihr Passwort für einen bestimmten Benutzer lautet vityata. Dann bitten Sie den Benutzer, es einzugeben. Nehmen Sie bei der Eingabe das Passwort und ändern Sie es in etwas anderes. Dies sollte das Passwort für die Datenbank sein. Ich meine, so etwas wie dieses:

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 

Lassen Sie uns sagen, dass das Benutzerkennwort vityata ist. Dann, nachdem der Benutzer es eingegeben hat, wird es zu cxlv|cwcc geändert, das das echte Kennwort für die Datenbank ist.

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

Last but not least - das ist, wie meine Klassen-Verbindung aussieht - https://github.com/Vitosh/VBA_personal/blob/6750f76e85540829056e7889c489a65daf85c696/cls_Connection.vb. Wenn Sie Ideen für Verbesserungen haben, würde ich mich freuen, eine Pull-Anfrage zu sehen.

+1

Guter Code - aber ich bekomme Zugriff darauf, dann kann ich das Passwort zurück lösen ... –

+0

Das ist 100% wahr. Aber du legst das Passwort nicht in einen Klartext. – Vityata

+0

Sicherheit durch Unklarheit - aber was ist, wenn seine DB die nuklearen Passwörter hat? –

2

Der Passwortschutz von VBA kann nicht als sicher betrachtet werden, da er leicht umgangen werden kann.

Sie könnten natürlich eine Art Verschleierung (Hash-Funktion o.ä.) in den VBA-Code einfügen, so dass das Passwort nicht im Klartext angezeigt wird, aber jeder, der mit VBA vertraut ist, sollte dies umgehen können etwas Zeit.

Ich würde in Betracht ziehen, den Zugriff auf die Datenbank mit einer Ansicht einzuschränken, die nur die benötigten Daten enthält.

Das Ausblenden des Passworts kann erfolgen, indem die Verbindungsfunktionalität in eine DLL eingefügt wird, auf die Sie dann im VBA-Code verweisen. Dies würde mehr Arbeit erfordern, um umzukehren, und gibt Ihnen viel mehr Möglichkeiten, die Anmeldeinformationen wirklich zu verbergen. Siehe auch diese Antwort: https://stackoverflow.com/a/19163256/5970009

+0

Dachte nicht darüber nach, die Verbindungsfunktionalität in eine DLL zu stellen. Das sieht vielversprechend aus; Ich werde es mir ansehen. Vielen Dank! –

Verwandte Themen