我有一个分布式 MsAccess 前端数据库,它使用 mysql 后端。
它使用 Windows 系统 DSN ODBC 连接来连接到服务器。我的所有链接表都引用该 ODBC 连接。但问题是,它们都使用相同的用户名和密码,这些用户名和密码都硬编码到每台计算机中。
有没有更好的方法来实现它以便每个用户都能获得其登录信息?
由于每个 DSN 连接都是“硬连线”的,因此我认为每次应用程序启动时重写注册表并不是一种安全的方式,因为应用程序崩溃时 DSN 设置仍会保留。
我不知道是否可以在提示时让系统 DSN 不输入用户名和密码,但是我们连接到四个不同的数据库,因此我不希望用户输入四次他们的信息,因为这只会让用户感到沮丧。
我在想,也许我可以将系统 DSN 用户用作用户表的只读,或者最好使用可以验证用户的过程,但一旦验证完成,我就不确定如何连接每个表。我可以在 ODBC 连接字符串中存储全局变量吗?
有什么更好的方法可以让 MsAccess 更加用户感知?
(我查看了 MSACCESS 安全设置,但似乎微软正在逐渐放弃这一设置,而我尝试建立它却完全锁定了我,并且没有提供任何形式的登录验证。我猜它只是使用 widows 登录作为安全性,但这不是一个真正的解决方案)这里有一个免责声明:
Access 2010 安全性简介 (office.microsoft.com)
访问和用户级安全性
Access 不支持以新文件格式(.accdb 和 .accde 文件)创建的数据库的用户级安全性。但是,如果您在 Access 2010 中打开早期版本的 Access 数据库,并且该数据库已应用用户级安全性,则这些设置仍将起作用。
重要提示 使用用户级安全功能创建的权限无法保护您的数据库免受恶意用户的攻击,并且并非安全屏障。使用此功能来提高受信任用户对数据库的可用性是适当的。为了帮助保护您的数据安全,请使用 Windows 文件系统权限仅允许受信任的用户访问您的数据库文件或关联的用户级安全文件。
如果将数据库从具有用户级安全性的早期版本的 Access 转换为新的文件格式,Access 会自动删除所有安全设置,并应用保护 .accdb 或 .accde 文件的规则。
最后,请记住,当您打开具有新文件格式的数据库时,所有用户都可以随时看到所有数据库对象。
答案1
据我了解,您希望为应用程序内的最终用户(“应用程序用户”)提供更加个性化的体验/环境,同时通过将用户身份验证过程与 OBDC DSN 连接凭据(“数据库用户”)结合起来来提高安全性。
my_app_db.users
这种定制的用户环境通常是通过让最终用户使用应用程序进行身份验证来实现的。这通常是通过让用户在应用程序加载时输入用户名和密码(通常存储在表中)来实现的。
在进行此应用程序用户身份验证之前,应用程序本身(或机器)需要与数据库服务器建立连接。此“数据库用户”通常通过以下方式实现:
- 静态、预定义的数据库用户/密码,硬编码到应用程序(和/或安装程序脚本/二进制文件)中。然后,安装脚本通常会要求您(服务器管理员)提供数据库凭据
CREATE
以及GRANT
权限(通常是 root 用户),以便安装程序可以创建所需的数据库用户。 - 预先创建并具有适当权限的用户定义数据库用户;然后,安装程序将要求您提供这些凭据,应用程序将使用它自己的可逆加密(或混淆)方法存储这些凭据,以便将这些凭据保存在客户端的某个位置(.dat 文件、注册表项等),以便在建立数据库连接之前可以读取。
至于安全性,最小特权规则在这里很重要:这个数据库用户只应被授予应用程序正常运行所需的最少特权(即 SELECT、INSERT、UPDATE 以及可能的 DELETE,并且只针对应用程序的数据库,而不是系统/主数据库)。
这与不是在最终用户机器上以纯文本形式存储数据库凭据可以有效地保护您的应用防止未经授权的访问。请记住,如果恶意用户获得已安装应用程序的计算机的本地管理员访问权限,那么游戏就结束了:他们可能会从内存中解密该连接字符串,甚至嗅探 MySQL 流量在网络接口上获取数据库用户的凭据,此时,就取决于您对该用户的限制程度(好吧,希望 MySQL 能够定期修补)以及攻击者的复杂程度和决心。
请记住,许多数据库应用程序都会使用应用服务器,它本质上是中间的“看守者”,代表客户端代理与数据库之间的连接。这样做通常是为了提高性能/可扩展性,但也有一个安全优势,即数据库服务器可以隔离/限制为仅供应用服务器使用,并且任何最终用户客户端都无法直接访问它。
至于 ODBC DSN 选项和 MySQL,我不太了解有哪些可用选项。不过,似乎确实有Windows 本机身份验证支持在 MySQL 的更高版本中。
我已经成功地将带有安全证书的 MySQL/NET 连接器与 MySQL 和 ASP.NET 应用程序结合使用,但是我不知道这是否可以扩展到 Microsoft Access;您可能必须在那里编写一些 .NET 粘合剂。
如果要具体说明的话,你最好去问堆栈溢出在那时候。
希望这可以帮助。