了解Access安全性
簡介
在早期版本的 Microsoft? Access(Microsoft Access 2000 以前)中,有關安全性的知識有時被認為是無法為任何人所掌握和應用的。您需要按順序執行很多步驟,一旦遺漏某個步驟或者顛倒了順序就會帶來災難性的后果。隨著 Microsoft Access for Microsoft Windows? 95 的 Security Wizard 出現,以及 Microsoft Access 2000 的 Security Wizard 的不斷改進,在 Access 中實現安全性已變得非常簡單。但是,即使有了這些幫助,您也必須清楚自己的安全選項,并掌握在數據庫中保護數據和對象的操作。否則,輕者會帶來數據安全隱患,重者會將您鎖在自己的數據庫之外。
有很多方法可以保護您的 Access 數據庫以及其中包含的數據。在本文中,我們將討論用于保護組成數據庫的各個對象(包含數據)、包含諸如窗體和報表等元素的對象以及代碼(可能是數據庫中最有價值的部分)的方法。本文中討論的安全技巧只適用于 Microsoft Access 數據庫 (.mdb) 文件。
需要了解的有關保護敏感數據的知識
您應該知道,有很多工具和第三方實用程序可以用于探測任何類型的數據庫的密碼,以及來自任何工作組信息文件的用戶名和密碼(本文后面將詳細介紹工作組信息文件)。如果需要保護敏感數據免受非法訪問,最好的安全措施就是使用計算機操作系統提供的文件級安全性和文件共享安全性。文件級安全性涉及在數據文件上設置權限。文件共享安全性涉及限制對數據文件存儲位置的訪問。文件共享安全性的一個示例是在存儲數據文件的文件夾(位于本地計算機或網絡服務器上)上設置用戶權限。為此,可以將數據拆分到多個文件中,在這些文件上設置用戶權限,再將這些文件放置到受保護的文件共享空間中。然后可以從具有安全設置的 Access 數據庫鏈接到這些文件。
Access 安全性概述
以下各節介紹了幾種保護 Access 數據庫的方法。
加密或解密數據庫
最簡單(也是安全性最低)的保護方法是對數據庫進行加密。加密數據庫就是將數據庫文件壓縮,從而使某些實用程序(如字處理器)不能解讀這些文件。加密一個不具有安全設置的數據庫并不能保證數據庫的安全,因為任何人都可以打開數據庫并完全訪問數據庫中的所有對象。有關對數據庫進行安全設置的詳細內容,請參閱本文后面的使用 Security Wizard 設置 Access 數據庫的安全性。
加密可以避免在以電子方式傳輸數據庫或者將其存儲在軟盤、磁帶或光盤上時,其他用戶偶然訪問數據庫中的信息。然而 Jet(Access 使用的數據庫引擎)使用的加密方法非常薄弱,因此絕不能用于保護敏感數據。“加密/解密數據庫”命令位于“工具”菜單的“安全”子菜單中。解密數據庫是對加密過程的逆運算。
使用自定義界面
另一種相對簡單的保護方案是使用自定義界面代替 Access 標準界面。與加密一樣,它也不能保護數據庫中的對象和敏感數據的安全。通過選擇“工具”菜單中的“啟動”選項,您可以指定自定義的啟動窗體、菜單,甚至自定義的標題和圖標。還可以選擇取消 Database 窗口,從而對缺乏相應技術的應用程序用戶隱藏這些對象。“啟動”對話框的各項功能也可以通過編程實現。有關如何從“啟動”對話框設置啟動選項的詳細信息,請參閱 Access 幫助中的“關于啟動選項”。有關如何通過編程設置啟動選項的詳細信息,請參閱 Access 幫助 Microsoft Visual Basic? 編輯器的“設置‘啟動’選項和編碼中的選項”。
設置數據庫密碼
您可以在數據庫上設置密碼,從而要求用戶在訪問數據和數據庫對象時輸入密碼。
注意:使用密碼保護數據庫或其中的對象的安全性也稱為共享級安全性。您不能使用此選項為用戶或組分配權限,因此任何掌握密碼的人都可以無限制地訪問所有 Access 數據和數據庫對象。“設置數據庫密碼”命令位于“工具”菜單的“安全”子菜單中。
用戶級安全性
除共享級安全性外,您還可以使用用戶級安全性,它提供了最嚴格的訪問限制,使您能夠最大限度地控制數據庫及其中包含的對象。這是我們所推薦的數據庫保護措施的一部分(當和操作系統提供的文件級和共享級安全性結合使用時),因此我們將在本文后面對用戶級安全性做詳細介紹。
同樣,我們也將討論用于保護數據庫中包含的 Visual Basic for Applications (VBA) 代碼的各種方法。
警告:用戶級安全性(在單獨使用時)主要用于保護數據庫中的代碼和對象,以免用戶不小心進行了修改或更改。如果不希望用戶非法訪問窗體、報表或模塊中的代碼,則必須將 .mdb 文件轉換為 MDE 文件(本文后面將詳細介紹)。要避免用戶修改數據庫中的查詢、宏或數據訪問頁,唯一的方法就是將數據庫文件放在一個受保護的文件共享區域中。此外,在 Access 中不可能既允許用戶修改表中的數據,同時又禁止其修改表的設計或刪除表。要提供這樣一種功能,需要使用一個基于服務器的數據庫產品,例如 Microsoft SQL Server?。設置模塊密碼
使用密碼可以保護所有標準模塊和類模塊(例如窗體和報表中包含的代碼)以免用戶不小心修改或查看 VBA 代碼。設置密碼后,您只需在每次會話時輸入一次密碼,以便在 Visual Basic 編輯器中查看或修改代碼。除查看和編輯外,在剪切、復制、粘貼、導出或刪除任何模塊時也都需要密碼。但應該清楚的是,使用這種方法保護代碼不能防止您或其他用戶運行代碼,也不能防止其他用戶使用第三方實用程序(如 16 進制編輯器)來查看代碼。要完全保護代碼,必須將 .mdb 文件轉換為 MDE 文件。
要為項目中的模塊設置密碼:
使用 MDE 文件
通過將數據庫文件轉換為 MDE 文件,可以完全保護 Access 中的代碼免受非法訪問。將 .mdb 文件轉換為 MDE 文件時,Access 將編譯所有模塊,刪除所有可編輯的源代碼,然后壓縮目標數據庫。原始的 .mdb 文件不會受到影響。新數據庫中的 VBA 代碼仍然能運行,但不能查看或編輯。數據庫將繼續正常工作,您仍然可以升級數據和運行報表。尤其是,將 Access 數據庫保存為 MDE 文件可以防止以下操作:
- 在設計視圖中查看、修改或創建窗體、報表或模塊。
- 添加、刪除或更改對對象庫或數據庫的引用。
- 使用 Access 或 VBA 對象模型的屬性或方法更改代碼 - MDE 文件不包含可編輯代碼。
- 導入或導出窗體、報表或模塊。而表、查詢、數據訪問頁和宏可以導入非 MDE 數據庫,或從中導出。
要將 .mdb 文件轉換為 MDE 文件:
有關將 .mdb 文件轉換為 MDE 文件的更多要求,請參閱 Access 幫助中的“保護 Access 數據庫中的 Visual Basic for Applications 代碼”。
下面我們來看看用戶級安全性。
關于 Access 用戶級安全性
Access 使用 Microsoft Jet 數據庫引擎來存儲和檢索數據庫中的對象。Jet 數據庫引擎使用基于工作組的安全模型(也稱為用戶級安全性)來判斷誰可以打開數據庫,并保護數據庫所包含對象的安全。無論是否明確設置了數據庫的安全性,用戶級安全性對所有 Access 數據庫始終處于打開狀態。您可以通過操縱用戶和組帳戶的權限和成員身份來更改 Access 中的默認安全級別。下面將對此進行介紹。
無論何時啟動 Access,Jet 數據庫引擎都要查找工作組信息文件(默認名稱為 system.mdw,也可以使用擴展名 .mdw 任意命名)。工作組信息文件包含組和用戶信息(包括密碼),這些信息決定了誰可以打開數據庫,以及他們對數據庫中的對象的權限。對單個對象的權限存儲在數據庫中。這樣,例如,就可以賦予一個組的用戶(而不是其他用戶)使用特定表的權限,而賦予另一個組查看報表的權限,但不能修改報表的設計。
工作組信息文件包括內置組(Admins 和 Users)以及一個通用用戶帳戶 (Admin),該帳戶具有管理數據庫及其包含的對象的權限(無限制)。您也可以使用菜單命令(“工具”菜單中的“安全”子菜單)或者通過 VBA 代碼添加新的組和用戶。
注意:安裝 Access 時,安裝程序會自動創建工作組信息文件,并使用您指定的名稱和單位信息來命名。因為這一信息通常很容易被判斷出來,因而未經授權的用戶很可能會創建另一個版本的工作組信息文件,從而在由該工作組信息文件定義的工作組中,為自己設定一個不可撤消的管理員帳戶(Admins 組的成員)權限。為防止發生這種情況,應創建一個新的工作組信息文件,并指定唯一的工作組 ID (WID)。這樣,只有知道 WID 的用戶才能創建該工作組信息文件的副本。本文后面將討論使用 User-level Security Wizard 創建新的工作組信息文件。Admins 組不能被刪除,其成員具有不可撤消的管理權限。您可以通過菜單或代碼刪除 Admins 組的權限,但 Admins 組的任何成員都可以重新添加權限。此外,Admins 組中必須始終至少有一個管理數據庫的成員。對于沒有進行安全設置的數據庫,Admins 組始終包含默認的 Admin 用戶帳戶,它也是所有用戶默認登錄的帳戶。
所有用戶必須屬于默認的 Users 組,不管他們是否還屬于其他組。您可以在 VBA 中創建用戶帳戶,而并不將新的用戶帳戶添加到 Admins 組中。然而,如果不同時將該用戶帳戶添加到 Admins 組中,該用戶將無法成功啟動 Access,因為 Access 內部使用的用于管理數據庫的很多表都映射到 Users 組的權限。
使用以下步驟進行 Access 數據庫的安全設置:
在默認 Admin 用戶帳戶上設置密碼會激活登錄對話框,從而每次啟動 Access 時都會提示用戶輸入用戶名和密碼。如果您沒有在 Admin 帳戶上設置密碼,用戶將自動作為 Admin 用戶登錄,無需密碼,也不會出現登錄對話框。
對數據庫中對象的權限可以是顯式的(直接分配給用戶帳戶)或隱式的(從用戶所屬的組繼承),也可以是兩者的結合。Access 在權限問題上使用“最少限制”規則,即用戶的權限包括其顯式和隱式權限的總和。例如,如果用戶 A 的帳戶具有限制權限,而用戶 A 屬于一個具有限制權限的組,同時也屬于另一個具有管理(所有)權限的組,那么用戶 A 將具有管理權限。有鑒于此,通常最好不要為用戶帳戶分配顯式權限。而應創建具有不同權限的組,然后將用戶分配給具有適當權限的組,這會減少數據庫管理方面的麻煩。
在以下各節中,我們將展示如何通過用戶界面和編程手段來保護數據庫及其包含的對象。首先,我們來看看幾種設置數據庫密碼的不同方法。
手動設置數據庫密碼
您可以為數據庫設置密碼,從而要求用戶在訪問數據庫時輸入密碼。然而,一旦用戶登錄后,便可以不受限制地訪問數據庫中的數據和對象。
注意:在設置數據庫密碼之前,建議備份數據庫并將其存儲在一個安全的位置。在設置數據庫密碼之前,需要以獨占方式打開數據庫。要以獨占方式打開數據庫:
要手動設置數據庫密碼:
現在就設置了數據庫密碼。下次您或其他用戶打開數據庫時,會出現一個對話框要求輸入密碼。下面我們來看看如何通過編程設置數據庫密碼。
通過編程設置數據庫密碼
按以下語法使用關鍵字 ALTER DATABASE,您可以編程設置、修改或刪除數據庫密碼。
ALTER DATABASE PASSWORD NewPassword OldPassword在這個語句中,密碼由方括號 ([]) 分隔的 String 值表示,但下述情況例外。
第一次設置數據庫密碼時,使用 NULL 關鍵字作為 ALTER DATABASE 語句中的 OldPassword 參數。要刪除數據庫密碼,請使用 NULL 關鍵字作為 ALTER DATABASE 語句的 NewPassword 參數。在這些情況下,關鍵字 NULL 不應出現在方框中。
在使用以下過程之前,可能需要設置對 Microsoft ADO Ext 2.5 for DDL and Security 庫的引用(如果尚未設置):
請看以下第一次設置密碼時的代碼:
Private Function CreateDBPassword(ByVal Password As String, _ByVal Path As String) As BooleanDim objConn as ADODB.ConnectionDim strAlterPassword as StringOn Error GoTo CreateDBPassword_Err' 創建 SQL 串以初始化一個數據庫密碼。strAlterPassword = "ALTER DATABASE PASSWORD [Password] NULL;"' 打開不具有安全設置的數據庫。Set objConn = New ADODB.ConnectionWith objConn.Mode = adModeShareExclusive.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data " & _"Source=Path;" ' 執行 SQL 語句對數據庫進行安全設置。.Execute (strAlterPassword)End With' 清除對象。objConn.CloseSet objConn = Nothing' 如果成功,返回 true。CreateDBPassword = TrueCreateDBPassword_Err:Msgbox Err.Number & ":" & Err.DescriptionCreateDBPassword = False End Function此過程接受用戶的密碼以及 .mdb 文件的路徑。首先,我們聲明一個變量,代表對不具有安全設置的數據庫的連接,同時聲明一個 String 變量以包含我們用于更改密碼的 SQL 語句。下一步,我們將 strAlterPassword 設置給使用 ALTER DATABASE PASSWORD 關鍵字的 Jet SQL 語句。請注意,因為我們不是要替換密碼,因而第二個參數被設置為 NULL。下一步,我們打開一個到該數據庫的連接。要設置密碼,必須以獨占方式打開數據庫,因此要設置 Mode 屬性。然后執行 SQL 語句。您通常可以從一個數據庫運行此過程,以便在一個單獨的不具有安全設置的數據庫中設置密碼。如果一切正常,函數返回 True。
如果要更改具有安全設置的數據庫的密碼,首先需要使用舊密碼登錄數據庫,然后再更改密碼。以下過程顯示了這一技術。
在使用以下過程之前,可能需要設置對 Microsoft ADO Ext 2.5 for DDL and Security 庫的引用(如果尚未設置):
請看以下過程:
Private Function ChangeDBPassword(ByVal OldPassword As String, _ByVal NewPassword As String, ByVal Path As String) As BooleanDim objConn as ADODB.ConnectionDim strAlterPassword as StringOn Error GoTo ChangeDBPassword_Err' 創建 SQL 串以更改數據庫密碼。strAlterPassword = "ALTER DATABASE PASSWORD [NewPassword] [OldPassword];"' 打開具有安全設置的數據庫。Set objConn = New ADODB.ConnectionWith objConn.Mode = adModeShareExclusive.Provider = "Microsoft.Jet.OLEDB.4.0".Properties("Jet OLEDB:Database Password") = "OldPassword".Open "Data Source=Path;" ' 執行 SQL 語句以更改密碼。.Execute (strAlterPassword)End With' 清除對象。objConn.CloseSet objConn = Nothing ChangeDBPassword = TrueChangeDBPassword_Err:Msgbox Err.Number & ":" & Err.DescriptionChangeDBPassword = False End Function此過程與前面的子例程類似,只是在登錄具有安全設置的數據庫時,需要使用更改之前的舊密碼。為此,針對要更改的數據庫,我們設置了 Connection 對象的 Database Password 屬性。這是 Connection 對象的擴展屬性之一,所以我們使用了如上所示的特殊語法。要從具有安全設置的數據庫中刪除密碼,也可以使用此過程,只需將 ALTER DATABASE 語句的第一個參數替換為 NULL 關鍵字即可。
下面我們來看看如何實現比在數據庫中設置密碼更強大的保護手段。
使用 Security Wizard 設置 Access 數據庫的安全性
可以使用 Security Wizard 設置數據庫的安全性。為此,請執行以下步驟:
圖 1:“設置安全機制向導”對話框的第二個屏幕
圖 2:“設置安全機制向導”對話框的第三個屏幕
圖 3:“設置安全機制向導”對話框的第四個屏幕
圖 4:“設置安全機制向導”對話框的第五個屏幕
圖 5:“設置安全機制向導”對話框的第六個屏幕
圖 6:“設置安全機制向導”對話框的第七個屏幕
下面我們來看看幾種編程使用用戶和組的方法。
通過編程添加和刪除用戶和組
為數據庫設置了安全性后,您可能需要使用用戶和組。以下各節展示了其中的一些技巧。
在使用以下各節介紹的過程之前,可能需要設置對 Microsoft ADO Ext 2.5 for DDL and Security 庫的引用(如果尚未設置):
添加和刪除用戶
以下過程將創建一個新的用戶帳戶,然后將其追加到用于當前數據庫的工作組信息文件中的默認 Users 組。
注意:要在 Access 中使用下面的示例,您需要作為 Admins 組的成員登錄并打開一個數據庫。在下面的過程中,您要確保工作組信息文件不包含在 strUser 中指定了其名稱的用戶。例如,您可以先調用 DeleteUser 子例程來確保這一點。請看以下代碼:
Private Function AddUser(ByVal strUser As String, _ByVal strPID As String, _Optional ByVal strPwd As String) As BooleanDim catDB As ADOX.CatalogOn Error GoTo AddUser_Err' 實例化 Catalog 對象。Set catDB = New ADOX.CatalogWith catDB' 使用到當前數據庫的連接打開' Catalog 對象。.ActiveConnection = CurrentProject.Connection' 創建新的用戶帳戶。.Users.Append strUser, strPwd, strPID' 向默認 Users 組追加新的用戶帳戶。.Groups("Users").Users.Append strUserEnd With' 關閉 Catalog 對象。Set catDB = NothingAddUser = TrueAddUser_Err:Msgbox Err.Number & ":" & Err.DescriptionAddUser = False End Function該過程首先為 Catalog 對象聲明一個變量,然后實例化該對象。
注意:Catalog 對象是 Access 數據庫文件中所有對象的容器。然后,該過程打開到當前數據庫的連接,并使用來自調用過程的參數,將新用戶追加到 Catalog 對象的 Users 集合中。然后新用戶被追加到默認的 Users 組。Users 集合包含了在工作組信息文件中定義的數據庫的所有用戶。
要刪除現有用戶,可以使用以下過程:
Private Function DeleteUser(ByVal strUser As String) As BooleanDim catDB As ADOX.CatalogOn Error GoTo DeleteUser' 實例化 Catalog 對象。Set catDB = New ADOX.CatalogWith catDB' 在當前數據庫中打開 Catalog 對象。.ActiveConnection = CurrentProject.Connection' 刪除 strUser。.Users.Delete strUserEnd With' 關閉 Catalog 對象。Set catDB = NothingDeleteUser = TrueDeleteUser_Err:Msgbox Err.Number & ":" & Err.DescriptionDeleteUser = False End Function此過程與前面的過程類似,只是使用了 Catalog 對象的 Delete 方法刪除了在 strUser String 參數中指定的用戶。
添加和刪除組
添加組的過程與添加用戶的過程類似。
Private Function AddGroup(ByVal strGroup As String, _ByVal strPID As String) As BooleanDim catDB As ADOX.CatalogOn Error GoTo AddGroup_ErrSet catDB = New ADOX.CatalogWith catDB' 在當前數據庫中打開 Catalog 對象。.ActiveConnection = CurrentProject.Connection' 創建新的組。.Groups.Append strGroup, strPIDEnd With' 關閉 Catalog 對象。Set catDB = NothingAddGroup = TrueAddGroup_Err:Msgbox Err.Number & ":" & Err.DescriptionAddGroup = False End Function此過程首先實例化 Catalog 對象,然后打開一個到當前數據庫的連接。接下來,通過使用來自調用過程的參數,將新組追加到 Catalog 對象的 Groups 集合。
要刪除現有組,可以使用以下過程:
Private Function DeleteGroup(ByVal strGroup As String) As BooleanDim catDB As ADOX.CatalogOn Error GoTo DeleteGroup_ErrSet catDB = New ADOX.CatalogWith catDB' 在當前數據庫中打開 Catalog 對象。.ActiveConnection = CurrentProject.Connection' 刪除 strGroup。.Groups.Delete strGroupEnd With' 關閉 Catalog 對象。Set catDB = NothingDeleteGroup = TrueDeleteGroup_Err:Msgbox Err.Number & ":" & Err.DescriptionDeleteGroup = False End Function此過程與前面的過程類似,只是使用了 Catalog 對象的 Delete 方法刪除了在 strGroup String 參數中指定的組。
下面我們來看看如何通過編程設置對數據庫對象的權限。
通過編程設置權限
要對數據庫中的各種對象設置權限,可以使用 Group 或 User 對象的 SetPermissions 方法。在下面的過程中,我們首先撤消組的所有權限,然后再賦予組特定的權限。這樣可以確保該組只具有我們指定的權限:
Private Function SetGroupPermissions(ByVal strGroup As String, _ByVal strTable As String, ByVal strObjectType As String, _ByVal strAction As String, _ByVal strRevokeEnum As String) As BooleanDim catDB As ADOX.CatalogOn Error GoTo SetGroupPermissions_ErrSet catDB = New ADOX.CatalogWith catDB' 在當前數據庫中打開 Catalog 對象。.ActiveConnection = CurrentProject.Connection' 撤消組的所有權限。.Groups(strGroup).SetPermissions tblTable, _strObjectType, strAction, strRevokeEnum' 賦予組特定的權限。.Groups(strGroup).SetPermissions tblTable, _strObjectType, strAction, _ adRightRead Or adRightInsert Or adRightUpdateEnd With' 關閉 Catalog 對象。Set catDB = NothingSetGroupPermissions = TrueSetGroupPermissions_Err:Msgbox Err.Number & ":" & Err.DescriptionSetGroupPermissions = False End Function在當前數據庫中打開一個 Catalog 對象后,我們使用了 Groups 集合的 SetPermissions 方法,撤消了該組對 Employees 表的所有權限。第一個參數是表的名稱,第二個參數顯示了對象的類型,這里是表。第三個參數指定了在設置權限時要執行的操作的類型,第四個參數是一個權限常數,指定了該組沒有任何權限。我們已經撤消了該組對 Employees 表的所有權限,現在可以賦予其所希望的權限。
下一個語句的前三個參數與前一個語句中的相同。第四個參數是通過使用 Or 運算符,組合不同的權限常數所創建的一個值。這里,我們賦予了讀取、插入和更新該表的權限。
要對指定類型(例如上述示例中的表)的所有新對象設置權限,請將用于賦予權限的語句中的第一個參數更改為 NULL 關鍵字。例如:
... catDB.Groups(strGroup).SetPermissions NULL, adPermObjTable ...?
小結
在本文中,我們討論了實現 Access 數據庫不同保護級別的各種方法,介紹了共享級和用戶級安全性。同時還介紹了如何使用 Access Security Wizard 以及如何通過編程來實現安全設置。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的了解Access安全性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp中隐藏下载地址
- 下一篇: ASP将查询数据导出EXCEL