如何解决绑定记录集实时更新存在安全隐患
------------------------------------
在客户端进行记录编辑时,可以将字段绑定到控件(比如表格)上,这样用户操作时,只要下移一条记录,则这条记录会实时更新到后台,这本来是非常方便的功能,但是有一个安全性问题不知大家注意到没有,在实际中是如何解决的?
这个安全性是这样的:
假如我操作期间,这个单据执行了审核操作,则理论上是不能再被修改的.但是绑定记录集的情况下,还会修改数据的,因为绑定字段的更新是系统自动的,他不会是验证这个单据是否已经审核过,所以这就是一个安全问题.可能你会问,有这种可能性吗,没改完就审核,我可以负责任的说,完全有可能的.但并不是没做完单据就审核,而是要保证审核后,数据会立即受到保护.
说到这里,不得不说一下我们单位曾经请一个小公司开发的管理程序.这个程序很不严格,假如A用户打开了这个单据,但是有点事出去了,注意,A用户并没有关闭打开的程序.这时B用户从另一台机器打开这个单据进行修改,然后审核.可是过了2个小时,A用户回来了,但是他不知道单据已经改好了.但依然续续修改2小时前打开的单据,这个单据还是可以修改的,因为程序只判断打开单据时的审核状态.
通过我举的例子你可能明白我说的意思了吧.
比如A用户打开修改单据的窗体想对单据进行修改(表格与数据绑定,下移记录便会自动更新),可此时A用户有事出去一下,他并没有关闭已经打开的窗体,这时B用户从自已的机器上修改了A用户没改完的单据,并进行审核.过一会A回来了,他并不知道B已经帮他将单据做好了并审核,就继续修改单据.此时还是可以改的.可见审核操作并没有禁止A用户对记录的修改,这就会造成误操作呀.
实际中如何处理这个安全问题呢?
------------------------------------
在客户端进行记录编辑时,可以将字段绑定到控件(比如表格)上,这样用户操作时,只要下移一条记录,则这条记录会实时更新到后台,这本来是非常方便的功能,但是有一个安全性问题不知大家注意到没有,在实际中是如何解决的?
这个安全性是这样的:
假如我操作期间,这个单据执行了审核操作,则理论上是不能再被修改的.但是绑定记录集的情况下,还会修改数据的,因为绑定字段的更新是系统自动的,他不会是验证这个单据是否已经审核过,所以这就是一个安全问题.可能你会问,有这种可能性吗,没改完就审核,我可以负责任的说,完全有可能的.但并不是没做完单据就审核,而是要保证审核后,数据会立即受到保护.
说到这里,不得不说一下我们单位曾经请一个小公司开发的管理程序.这个程序很不严格,假如A用户打开了这个单据,但是有点事出去了,注意,A用户并没有关闭打开的程序.这时B用户从另一台机器打开这个单据进行修改,然后审核.可是过了2个小时,A用户回来了,但是他不知道单据已经改好了.但依然续续修改2小时前打开的单据,这个单据还是可以修改的,因为程序只判断打开单据时的审核状态.
通过我举的例子你可能明白我说的意思了吧.
比如A用户打开修改单据的窗体想对单据进行修改(表格与数据绑定,下移记录便会自动更新),可此时A用户有事出去一下,他并没有关闭已经打开的窗体,这时B用户从自已的机器上修改了A用户没改完的单据,并进行审核.过一会A回来了,他并不知道B已经帮他将单据做好了并审核,就继续修改单据.此时还是可以改的.可见审核操作并没有禁止A用户对记录的修改,这就会造成误操作呀.
实际中如何处理这个安全问题呢?
解决方案 »
- 怎么样得到一个combobox中有多少个选项,或者怎么样从combobox的第一个遍历到最后一个。
- PChar转String
- 广州短期高薪急聘Delphi程序员,要求水平高,兼职亦可!
- webbrowser的问题
- 如何判断一个字符串是否为有效的日期格式???
- 关于ComboBox的显示风格
- 急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!在线等!等!等!等!等!等!等!等!等,神啊,救救我吧?????
- 关于怎样提高查询速度的问题?
- delphi7的安装序列号是什么啊?送分……
- 请教一个关于"流"文件的问题?
- 如何以最高的效率格式化字符窜
- 谁来救救我郁闷了很久。。DBGridEh的奇怪问题
用户数据审验安全问题:这个也是可以控制的,不如,当用户审核完毕之后,提交数据之前,应该先判断原先数据状态,如果已经审核,则不允许再次修改审核,如果未审核,则执行审核,如果某数据已经被删除,则提示数据不存在等。
也就是UI代码和业务 数据剥离,这才是治本之道。
设计问题~
这属于一种同步更新问题~
对于这种问题,我的解决方法是这样:
如果用户修改某数据后,应该在该条记录中加上只读锁~这样就保证当A离开时,B根本就打不开那条记录,其实就是建一个LockTable而已。
其实这种解决方法和VSS是一样的,只不过VSS控制的粒度是文件而已!
当某用户A修改该记录后,在没有保存记录的情况下离开,B也打开了该记录,这时B修改记录后并保存,在保存后,
就应该做这些事:
1.获取当前连接SQL的Client IP
2.对Client IP进行发送消息,显示该记录已被修改并给出解决方法,这时用户A回来后,看到这个信息,也就会退出窗体,重新进入。
也就是UI代码和业务 数据剥离,这才是治本之道。
---------------------------
这位大哥说的非常有道理,也是理想化的程序~
但LZ说的问题并不是这样设计就能够解决的。
还有另一种方法:
就是在更新数据前,把WHERE A=.. B=..布及到各个字段,这样如果没有相应的数据被更新,就说明有人已经把该记录修改~