2016-12-12 4 views
2

J'ai une feuille de calcul Excel (.xlsb) qui se connecte à un serveur SQL via ActiveX Data Objects (ADO) dans VBA que je dois partager avec un groupe de personnes. Le code utilise la chaîne suivante pour vous connecter faire la base de données:Comment sécuriser une connexion ADO dans un projet Excel VBA?

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

Comment puis-je garder mon nom d'utilisateur SQL et le mot de passe sécurisé et empêchent 3e parties d'y avoir accès? Est-ce que la protection par mot de passe du projet VBA est suffisante ou peut-elle être facilement piratée?

+0

Avez-vous pensé à parler à l'administrateur de base de données pour une connexion qui donne uniquement accès aux données que les utilisateurs verront quand même? Vous avez une vue dans la base de données et un compte qui peut uniquement accéder aux données dans cette vue .... –

+0

Pouvez-vous limiter la sécurité en fonction de l'ID machine/utilisateur dans SQL Server? –

+0

@RobinMackenzie Le compte que j'utilise déjà est en lecture seule, mais je ne veux pas que quiconque voit les détails de connexion. –

Répondre

2

Le projet VBA est non protégé assez - toute personne avec 2 heures de temps libre et Internet peut probablement passer.

Quel est le scénario de base est de rendre différents utilisateurs au niveau de la base de données avec des autorisations différentes. Ensuite, demandez à vos utilisateurs sur la feuille de calcul Excel de donner le mot de passe et le nom d'utilisateur dans l'une des cellules ou via le formulaire utilisateur. Prenez le mot de passe et le nom d'utilisateur et utilisez-le dans la chaîne de connexion. Comme une étape supplémentaire à la sécurité, vous pouvez utiliser un petit tour, que j'appelle salting. Par exemple. Disons que votre mot de passe pour un utilisateur donné est vityata. Ensuite, demandez à l'utilisateur de l'entrer. En entrant, prenez le mot de passe et changez-le en quelque chose d'autre. Ce quelque chose d'autre devrait être le mot de passe de la base de données. Je veux dire quelque chose comme ceci:

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 

Disons que le mot de passe de l'utilisateur est vityata. Ensuite, après que l'utilisateur l'a entré, il est changé en cxlv|cwcc, qui est le vrai mot de passe pour la base de données.

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

Last but not least - voilà comment ma connexion classe ressemble - https://github.com/Vitosh/VBA_personal/blob/6750f76e85540829056e7889c489a65daf85c696/cls_Connection.vb. Si vous avez des idées d'amélioration, je serais heureux de voir une demande d'extraction.

+1

Bon code - mais j'y ai accès alors je peux back-solve le mot de passe ... –

+0

C'est 100% vrai. Mais au moins, vous ne mettez pas le mot de passe dans un texte brut. – Vityata

+0

Sécurité à travers l'obscurité - mais que se passe-t-il si sa DB a les codes d'accès nucléaires? –

2

La protection par mot de passe VBA ne peut pas être considérée comme sûre car elle est facilement contournée. Vous pouvez bien sûr ajouter une sorte d'obfuscation (fonction de hachage ou similaire) dans le code VBA, afin que le mot de passe ne soit pas visible en texte clair, mais toute personne familière avec VBA devrait être capable de contourner cela dans peu de temps.

Je envisagerais de restreindre l'accès à la base de données avec une vue qui ne contient que les données nécessaires.

Cacher le mot de passe pourrait être fait en mettant la fonctionnalité de connexion dans une DLL, que vous référencez ensuite dans le code VBA. Cela nécessiterait plus de travail pour inverser et vous donne beaucoup plus de possibilités pour vraiment cacher les informations d'identification. Voir aussi cette réponse: https://stackoverflow.com/a/19163256/5970009

+0

N'a pas pensé à mettre la fonctionnalité de connexion dans un DLL. Cela semble prometteur; Je vais regarder dedans. Merci! –