防止用户绕过 MS Access 上的登录表单

Posted

技术标签:

【中文标题】防止用户绕过 MS Access 上的登录表单【英文标题】:Prevent users from being able to bypass a login form on MS Access 【发布时间】:2018-02-15 20:32:53 【问题描述】:

我创建了一个登录表单,其中包含用于用户类型(管理员、用户)的组合框和用于密码的文本框。表单代码如下。

Private Sub txtPassword_AfterUpdate()

If IsNull(Me.cboUser) Then
    MsgBox "You need to select a user!", vbCritical
    Me.cboUser.SetFocus
Else
    If Me.txtPassword = Me.cboUser.Column(2) Then
        If Me.cboUser.Column(3) = True Then
            MsgBox "Password does not match, please re-enter!", vboOkOnly
            Me.txtPassword = Null
            Me.txtPassword.SetFocus
        End If
        DoCmd.OpenForm "FE1"
        Me.Visible = False
    Else
        MsgBox "Password does not match, please re-enter!", vboOkOnly
        Me.txtPassword = Null
        Me.txtPassword.SetFocus
    End If
End If
End Sub

Private Sub cboUser_AfterUpdate()
Forms!frmLogin!cboUser.Column (2)
End Sub

它在技术上是有效的(用户可以使用他们的用户类型和密码登录),但他们也可以直接关闭它并访问数据库的其余部分。

如何阻止这种情况发生?

【问题讨论】:

禁用 X 关闭按钮。禁用右键单击快捷菜单。隐藏导航窗格。 【参考方案1】:

您既可以启用Modal 属性,也可以禁用CloseButton 属性:

请注意,使用Modal 属性时,您需要在完成后关闭表单:DoCmd.Close acForm, Me.Name 而不是Me.Visible = False 但是,这仍然远离适当的安全性。

如果您拒绝使用 VBA 关闭表单,它会变得更安全:

Private Sub Form_Unload(Cancel As Integer)
     Cancel = True
     If Me.txtPassword = Me.cboUser.Column(2) And Not Me.cboUser.Column(3)  Then
        Cancel = False
    End If
End Sub

关于拒绝通过 VBA 关闭的警告:这也会在关闭数据库时触发,如果人们没有输入正确的密码,则拒绝关闭数据库!任何人在没有有效密码的情况下打开它,要么必须通过任务管理器终止访问,要么精通技术以绕过它(我提到它不安全,对吗?),或者通过强制关闭他们的计算机来终止它。

但是,为了接近真正的基于用户的安全性,您将不得不完全改变您的设计。我在this answer中提供了我的考虑和一个更合适设计的样本

【讨论】:

以上是关于防止用户绕过 MS Access 上的登录表单的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 中启用与登录显示表单冲突的内容

根据 MS Access 中的用户过滤子表单

MS Access 2010 上的可编辑文本框 - 行为正确吗?

MS Access - 在表单之间传递登录信息

MS Access 表单上的密码保护提交按钮仍会导致按钮提交

MS Access 中的 .Net 用户控件