Office中国论坛/Access中国论坛

标题: 【Access安全】Access数据安全保障的三板斧 [打印本页]

作者: 红尘如烟    时间: 2012-6-18 11:51
标题: 【Access安全】Access数据安全保障的三板斧
本帖最后由 红尘如烟 于 2012-6-18 17:36 编辑

  现在一直忙工作,很长时间都没上过论坛了,冒个泡。朋友们都在的哇?

  每个人都会追求完美,在基本上满足了业务需求之后,大多数人都会想让数据变得更安全。数据的安全分为服务端和客户端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语句。




作者: 风中漫步    时间: 2012-6-18 12:30
斧子不错!!!!!!!!!!!!!!!!!
作者: Henry D. Sy    时间: 2012-6-18 13:07
谢谢分享!
作者: jinzhanxi    时间: 2012-6-18 16:09
谢谢分享~~~~~~~~···
作者: yy2000    时间: 2012-6-18 16:46
谢谢分享!
作者: t小宝    时间: 2012-6-18 17:16
学习!红尘现在是大忙人了。。。
作者: gxy100    时间: 2012-6-18 21:19
顶啊 啊啊
作者: zyp    时间: 2012-6-18 23:11
谢谢, 受益匪浅
作者: bjcompass    时间: 2012-6-19 01:16
学习。
作者: bjcompass    时间: 2012-6-19 01:16
学习,收藏了,谢谢
作者: bjcompass    时间: 2012-6-19 01:17
谢谢,学习!
作者: 轻风    时间: 2012-6-19 10:47
最近高人一个个都忙去了。
作者: 轻风    时间: 2012-6-19 10:56
用代码隐藏表后,就算取消隐藏了,还是不能新建表、查询等?
作者: fnsmydyang    时间: 2012-6-19 11:28
学习学习,顶一下。
作者: zyp    时间: 2012-6-22 10:57
谢谢版主的无私奉献.

我测试了一下, 这个隐藏表的代码在Mdb中很好用, 但不知为何, 显示全部表后, 系统表也显示出来了, 而且不论在工具选项怎么设置,都隐藏不了系统表;

另外, 隐藏表代码在ADP中不可用, 好像ADP中没有CurrentDb, 不知版主有没有方法来隐藏ADP的表;

用户通过连接来取得已经打开的客户端来取得AdP的表,虽说不能更改数据, 但所有的数据都可以查看, 这点对于有些需要保密的数据来讲很不好.
作者: ycxchen    时间: 2012-6-22 15:30
本帖最后由 ycxchen 于 2012-6-22 15:31 编辑

ADP表是什么意思?
作者: zyp    时间: 2012-6-22 21:10
ycxchen 发表于 2012-6-22 15:30
ADP表是什么意思?

是指ACCESS项目的表,它本身不是ACCESS的表, 是源于SQL Server的表
作者: 真主    时间: 2012-6-23 10:09
Private Sub btnHideTables_Click()
    Dim tdf As Object
    Const dbHiddenObject = 1

    For Each tdf In CurrentDb.TableDefs
        tdf.Attributes = dbHiddenObject
    Next
版主,以上代码可以隐藏表,但如何隐藏查询?

作者: ycxchen    时间: 2012-6-23 10:28
真主 发表于 2012-6-23 10:09
Private Sub btnHideTables_Click()
    Dim tdf As Object
    Const dbHiddenObject = 1

同样关注!
作者: wang1950317    时间: 2012-6-23 13:52
受教!谢谢!收藏啦!
作者: shuix    时间: 2012-7-21 15:21
这个很好,我喜欢!
作者: cjssxo    时间: 2012-7-21 19:40
经典,值得收藏
作者: shuix    时间: 2014-1-23 08:37
很好的素材,收藏慢慢研究
作者: sxgaobo    时间: 2014-10-16 18:25
先谢谢版主的无私!
请教下,加$后在网上邻居里是看不到了,可原来的链接表也失效了。
您说的:创建链接表时使用UNC路径,怎么用啊,能详细的介绍下吗?
作者: sxgaobo    时间: 2014-10-16 19:08
搞定了!!!不好意思 啊
作者: zh131443    时间: 2015-1-21 12:02
非常好,就是能不能再写的全面点,大家顶
作者: itdesigner    时间: 2015-3-28 20:45
强~
作者: mabaor    时间: 2015-4-26 19:28
好文章呀
作者: sxgaobo    时间: 2015-6-23 15:39
    Set r = CurrentDb.OpenRecordset("表名表")
    While Not r.EOF
    strConn = "ODBC;DRIVER=SQL Server;SERVER=" & r.IP & ";DATABASE=" & r.数据库 & ";UID=" & r.用户 & "WD=" & r.密码
       DoCmd.TransferDatabase acLink, "ODBC", strConn, acTable, r.名称, r.名称
      r.MoveNext
    Wend
将您的例子做了下修改,想做个通用的模块,可报错~!错在哪里了啊?
作者: lintina892    时间: 2015-6-27 21:10
谢谢分享!
作者: lintina892    时间: 2015-6-27 21:12
谢谢分享!
作者: Alashome    时间: 2015-7-10 08:33
good
作者: xiongml    时间: 2015-7-24 20:30
777888
作者: WFH6898    时间: 2015-11-12 13:05
三板斧确实厉害
作者: access新新新手    时间: 2015-12-7 13:33
谢谢分享
作者: Superleistung    时间: 2016-3-9 10:12
学习了~
作者: WXW7848    时间: 2016-11-27 20:43

作者: boon    时间: 2019-2-21 19:43
学习了,收藏了




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3