2016-12-12 42 views
2

私は複数の人と共有しなければならないVBAのActiveX Data Objects(ADO)を介してSQL Serverに接続するExcelスプレッドシート(​​.xlsb)を持っています。コードは、データベースの操作を行い接続するには、以下の文字列を使用しています:Excel VBAプロジェクトでADO接続を保護する方法は?

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

は、どのように私は私のSQLのユーザ名とパスワードを安全に保つとそれらへのアクセスを獲得するサードパーティのを防ぐのですか?パスワードで保護されたVBAプロジェクトは十分ですか、それとも簡単にクラッキングできますか?

+0

DBAと話し合って、ユーザーがとにかく見ることができるデータへのアクセスのみを提供するログインについて考えましたか? DB内のビューとそのビューのデータにしかアクセスできないアカウントがあります。 –

+0

SQL Serverのマシン/ユーザーIDに基づいてセキュリティを制限できますか? –

+0

@RobinMackenzie私が使っているアカウントは既に読み取り専用ですが、ログインの詳細を誰にも見せたくありません。 –

答えて

2

VBAプロジェクトはではありません。は十分に保護されています.2時間無料でインターネットが通じる可能性があります。

基本的なシナリオは、異なる権限を持つDBレベルで異なるユーザーを作成することです。次に、Excelスプレッドシート上のユーザーに、セルの1つまたはユーザーフォームにパスワードとユーザー名を入力するように依頼します。パスワードとユーザー名を取り出し、接続文字列で使用します。

セキュリティのさらなる一歩として、私は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 

少なくとも最後にではなく、 - https://github.com/Vitosh/VBA_personal/blob/6750f76e85540829056e7889c489a65daf85c696/cls_Connection.vb - これが私のクラスの接続がどのように見えるかです。あなたが改善のためのアイデアを持っているなら、私はプルリクエストを見てうれしいです。

+1

ニースコード - しかし、私はそれにアクセスして、パスワードを逆に解決することができます... –

+0

それは100%真です。しかし、少なくともあなたは平文のパスワードを入れてはいけません。 – Vityata

+0

不明確なセキュリティ - DBに核のパスコードがある場合はどうなりますか? –

2

VBAのパスワード保護は簡単に回避できるので、安全であるとは見なされません。

もちろん、VBAコードにはある種の難読化機能(ハッシュ関数など)を追加してパスワードをプレーンテキストで表示することはできませんが、VBAに精通している人なら誰でもこの問題を回避できるはずです少しの時間。

私は、必要なデータだけを含むビューでdbへのアクセスを制限することを検討したいと思います。

パスワードを非表示にするには、dllに接続機能を入れてから、VBAコードで参照します。これは逆にするためにより多くの作業が必要になり、本当に資格情報を隠す可能性が増します。この返信も参照してください:https://stackoverflow.com/a/19163256/5970009

+0

dllに接続機能を置くことについて考えなかった。これは有望です。私はそれを調べます。ありがとう! –

関連する問題