绑定记录集实时更新存在安全隐患,大家如何避免的
------------------------------------
在客户端进行记录编辑时,可以将字段绑定到控件(比如表格)上,这样用户操作时,只要下移一条记录,则这条记录会实时更新到后台,这本来是非常方便的功能,但是有一个安全性问题不知大家注意到没有,在实际中是如何解决的?
这个安全性是这样的:
假如我操作期间,这个单据执行了审核操作,则理论上是不能再被修改的.但是绑定记录集的情况下,还会修改数据的,因为绑定字段的更新是系统自动的,他不会是验证这个单据是否已经审核过,所以这就是一个安全问题.可能你会问,有这种可能性吗,没改完就审核,我可以负责任的说,完全有可能的.但并不是没做完单据就审核,而是要保证审核后,数据会立即受到保护.
说到这里,不得不说一下我们单位曾经请一个小公司开发的管理程序.这个程序很不严格,假如A用户打开了这个单据,但是有点事出去了,注意,A用户并没有关闭打开的程序.这时B用户从另一台机器打开这个单据进行修改,然后审核.可是过了2个小时,A用户回来了,但是他不知道单据已经改好了.但依然续续修改2小时前打开的单据,这个单据还是可以修改的,因为程序只判断打开单据时的审核状态.
通过我举的例子你可能明白我说的意思了吧.
比如A用户打开修改单据的窗体想对单据进行修改(表格与数据绑定,下移记录便会自动更新),可此时A用户有事出去一下,他并没有关闭已经打开的窗体,这时B用户从自已的机器上修改了A用户没改完的单据,并进行审核.过一会A回来了,他并不知道B已经帮他将单据做好了并审核,就继续修改单据.此时还是可以改的.可见审核操作并没有禁止A用户对记录的修改,这就会造成误操作呀.
实际中如何处理这个安全问题呢?

解决方案 »

  1.   

    楼主没明白我的意思,可惜我打了这个多字呀,能不能看明白再回呀。
    再注:A用户是有权限的。但是A用户打开窗体后,在没关闭已打开窗体的情况下出去了一下,就在他出去的同量,B用户在自已的机器上将A用户没做完的事做完了。按理说,A用户不用再做了,可是A并不知道,他回来后继续离开前的操作。
    问题的关键是,A用户此时应该没有编辑权了,因为单据已经审核了,但是由于A用户要继续2小时前的工作,而2小时前,记录已经与表格进行绑定了。A用户改过后,照样更新到后台,而不会进行是否审核的验证。
    如果要实现每次更新时都要审核,就无法使用绑定记录集的功能呀。
      

  2.   

    如果你将 业务和UI 分开,处理这样的问题就很简单
    1 由于Ui 上绑定的View数据,即使造成修改,也是对装载View数据的数据集进行修改。当每次提交这些变化后,在BAL判断提交上来的数据的生存周期,是否以当前的一致,不一致就不能修改,并返回提示!
      

  3.   

    哦,再看看!这样咯,在界面上弄个label记录改用户名,你弄个标识字段(用来记录label的值),当有人(A)在读取,并点击修改键时,把这条数据的标示字段更新为(label.text) ,.当用户A点击保存时,检测label是否等于数据库中的标示,如果等于,则执行保存操作.如果不等于,就不执行,这样,其他人就只能看不能保存,就算修改也冒用,不会更新数据库!当A执行操作完毕后,就把数据库中该条数据的标示字段更新为空.这样其它人,只能在A用完后修改保存改条语句.
      

  4.   

    存储过程中判断一下。if (@审核标志位 is null) or (@审核标志位 = '')
    begin
       update……
    end或者直接
    update……where 审核标志位=未审核
      

  5.   

    呵呵,你不觉得这样就成了很耦合的程序了吗?那岂不是你的UI中有很多业务逻辑代码?如果非要这样处理不可,建议重新开设一个线程刷新当前数据的生存周期和数据在UI上的展示。
      

  6.   

    存储过程中判断一下。 if   (@审核标志位   is   null)   or   (@审核标志位   =   '') 
    begin 
          update…… 
    end 或者直接 
    update……where   审核标志位=未审核 
    如果你不能控制每条写入的判断,可以肯定应该从数据库入手。 
    约束,写触发器~~
      

  7.   

    谢谢你的回贴,也可能我没有理解到位,再问问你吧. 
    假如我设置成自动更新,即下移一条记录时,就自动更新,如何在更新时可以检测某个标识字段呢? 
    我确实不知如何实现,注意,是自动更新,不是用代码更新. 
    谢谢
    ------------------------------------------------------------------------------------------
    如果是数据库本身的自动更新(非代码),就是数据库的刷新,并不会自己去添加数据。(请问你设置的自动更新是什么,数据库?还是软件本身?)如果是软件本身:
    软件系统显示界面是用代码编写的,并不是人家在界面加了个什么,数据库就添加了什么,而是别人加了以后再保存到数据库。你说的下移一条数据,就自动更新,其实就是软件系统在下移的时候添加了更新数据库的代码。如果你还是不理解,你可以看看数据显示框下移一条数据时的代码,或者把代码发上来。
    ----------------------------------------------------------------------------------------
    反之,你想想,如果是数据库自己更新软件系统界面的数据,自己把那些数据添加进来,那不是还没等人修改完,它就已经保存了!如果是那样的话,干脆,只让人看得了!说白了,你这系统要解决这缺点的方法多了,就是权限方面麻烦;我公司用的ERP系统就是用标示来锁定数据的,限制为只能一个人修改某条数据(已审核的数据只有特定权限(管理员)才能修改),不能多人同时修改一条数据(或已审核的数据)。虽然是VB系统,慢了点,但权限还是设置的可以的,尚未出现你说的这种情况,各人做各人的,互不干扰!
    所谓 自动更新  包括数据库在内,都是用代码写出来的,只是写这代码的软件不同而已!你可以先用楼上说的去试试,不行的话再过来说不行!