|
每个人都会追求完美,在基本上满足了业务需求之后,大多数人都会想让数据变得更安全。数据的安全分为服务端和客户端2个部分。下面分别就使用Access和SQL Server作为后台数据库时的安全向大家分享一下我的经验。
Access作为后台数据时:
Access作为后台数据库时,安全性是最弱的,因为它是文件型数据库,本身只是作为一个文件存放在服务器上的,所有处理都是通过客户端来进行的,而因为并发锁定的问题,需要具有写权限才能维护锁定文件(ldb或laccdb),因此所有用户都对其具有读写权限。这种情况下基本上所有用户只要知道了文件路径,都可以随意将数据库文件拷走。因此除了对数据库设置密码(这里强烈建议尽量使用新版本的Access,现在对于mdb格式的数据库,密码破解工具满天飞,设不设密码都一个样,而accdb格式的数据库密码现在还没有听说被谁破解),剩下我们唯一能做的,就是隐藏数据库的存放位置,不要让用户知道数据库放在哪里在。具体处理方法为:
1.将数据库所在的共享文件夹的共享名后面加$符号,这样可以将共享文件夹在网上邻居中实现隐藏,也就是说打开网上邻居中就看不到共享文件夹了。
2.创建链接表时使用UNC路径,而不要使用映射驱动器,使用映射驱动器的话,前面的隐藏就没有任何意义了。UNC路径以2个反斜杠开头,格式为\\servername\sharename,例如:\\192.168.1.1\罗斯文商贸系统后台数据库$\罗斯文商贸系统数据库.mdb
注意,这里的servername参数可以是计算机名称,也可以是IP地址。
对于客户端部分,主要是对于表的隐藏,当然这里不是说的在表名称上点右键,然后在属性中选择“隐藏”,这种方式只要是稍微熟悉Access操作的人都能破解。我们说的是用代码设置的隐藏,这种方式的隐藏/取消隐藏都只能通过代码来实现,即使将选项设置中的“显示系统对象”勾选仍然是看不到表的。具体实现方式为:
新建一个窗体,在窗体中创建2个命令按钮,第1个按钮命名为btnHideTables,标题属性设为“隐藏所有表”,第2个按钮命名为btnUnhideTables,标题属性设为“取消隐藏所有表”。按钮对应的单击事件代码如下:
Private Sub btnHideTables_Click()
Dim tdf As Object
Const dbHiddenObject = 1
For Each tdf In CurrentDb.TableDefs
tdf.Attributes = dbHiddenObject
Next
End Sub
Private Sub btnHideTables_Click()
Dim tdf As Object
For Each tdf In CurrentDb.TableDefs
tdf.Attributes = 0
Next
End Sub
|
SQL Server作为后台数据库时:
因为SQL Server本身就具有相应的安全机制,只要合理使用,就基本上没有什么问题。如果不能保证服务器只有特定人员才能使用时,建议将企业管理器的登录设为采用数据库账户认证,而不要使用Windows身份认证模式。
对于客户端部分,在创建文件DSN或者系统DSN的时候不要保存密码,当然也可以不使用任何DSN直接用代码来创建链接表,代码如下: Dim strConn As String
strConn = "ODBC;DRIVER=SQL Server;SERVER=192.168.1.1;UID=你的用户名;PWD=你的密码;DATABASE=你的数据库名称"
DoCmd.TransferDatabase acLink, "ODBC", strConn, acTable, "表1", "表1" |
在创建链接表的时候不要勾选“记住密码”选项,这样就算别人打开客户端看见了表,他不知道数据库登录密码就无法打开表看到其中的数据。但是这样的话每次登录时都会跳出一个SQL Server登录窗口,要求输入密码,对于这个问题我们可以在登录时先用代码打开一下数据库,这样ODBC连接池中就已经连上了数据库,然后任何对数据的访问都不会再跳出SQL Server登录窗口了。这里打开数据库是基于客户端程序进程的,因此当关闭客户端之后,ODBC连接池中的连接就会失效断开。打开数据库的代码一般放在登录按钮的单击事件过程中:
Private Sub btnLogin_Click()
Dim strConn As String
strConn = "ODBC;DRIVER=SQL Server;SERVER=192.168.1.1;UID=你的用户名;PWD=你的密码;DATABASE=你的数据库名称"
Set dbs = DBEngine.OpenDatabase("", False, False, strConn)
dbs.Close
'其它登录处理代码
End Sub |
使用该方法时,当客户端登录之后,别人仍然可以通过创建到客户端的链接表来访问表中的数据,因此我们还需要结合前面讲到的隐藏表的方法一起使用,从而最大限度的保证数据安全。
上面的方法都是基于对表的保护,但是对于查询就没有什么太好的办法了,只能尽量少用查询,比如窗体数据源的查询名称改为SQL语句。
|
|