令牌机制在B/S应用系统中表单重复提交问题的研究与应用
2011-12-21高河福
高河福
(广州市森锐电子科技有限公司,广东广州 510664)
令牌机制在B/S应用系统中表单重复提交问题的研究与应用
高河福
(广州市森锐电子科技有限公司,广东广州 510664)
本文分析了B/S结构的应用系统中表单重复提交的原因,并在深入研究同步令牌核心工作原理和应用过程的基础上,将同步令牌的机制用于解决表单重复提交的问题,让需要避免重复提交的页面在每次提交页面时携带同步令牌,通过初始化令牌、校验令牌、销毁令牌等步骤,解决了表单重复提交的问题.并对其实现的过程进行了分析和阐述.
表单;同步令牌;
1 引言
在B/S结构的系统中应用了大量的表单,表单中存在着许多方便的功能如刷新、后退和前进等,这些功能给浏览器带来方便性的同时,也给系统带来了表单重复提交的问题.由于表单数据的重复提交,导致网络和服务器资源的浪费,并有可能导致数据库数据冗余,严重时可导致服务器死机现象[1].
本文总结了引起表单重复提交的原因,并引入令牌环作为解决该问题的技术,对令牌机制解决表单重复提交的原理进行分析和研究,并对其实现过程进行了分析和阐述.
2 B/S应用系统中表单重复提交问题分析
在B/S结构的应用系统中,导致表单重复提交问题的原因有以下几个:
(1)用户恶意请求服务器,比如暴力破解密码等行为.
(2)因为浏览器和机器的性能问题,用户等待不了服务端返回数据不断发送表单.
(3)用户习惯快捷键操作,容易多次回车发送请求.
(4)在表单接收完之前,重新提交了同样的表单.
上述情况大多是发生在WEB层之前,是重复提交表单请求的主要原因.对于一些关键的页面,如购物进出帐等不做好限制输入机制,会导致脏数据的发生.如图1所示:
图1 表单重复提交问题
如图1所示,客户端重复请求了两次相同的内容,如果系统没有作出对应的限制输入过滤机制,业务层的EJB将重复执行两次处理的逻辑.用户这样操作后,数据库将出现脏数据,(当插入数据时,EJB生成表的主键,是由后台自动生成),或者系统会出错(如果用户输入的信息已经包含主键).为了避免这种错误发生,可以在客户端-WEB层通过脚本进行校验,但是这样每个页面分发都要手工校验,效率很低,而且当用户通过对WEB层-业务层直接发送请求,也不可避免地重复处理相同的请求.因此在各层(客户端到WEB端,WEB端到业务层,业务层到数据库)之中,在客户端和Web层加入控制代码的效果是最好的.因为在发送提交后到检测到该提交是重复提交已经浪费了处理的时间,重复提交所经过的流程处理就引起了资源浪费[2].
本文阐述了如何使用令牌机制来避免页面在提交请求时候,服务器重复执行提交的相同逻辑.具体实现的方法是,首先服务器端的将页面请求中的令牌值与当前用户的令牌值进行匹配,而且,在答复客户端之前,产生一个新的令牌保存起来,如果用户重复提交页面的时候,就会导致客户端的令牌和服务器端的令牌不一样,如果两端的令牌相同或令牌不存在就不进行发送、不处理逻辑,否则响应请求.
3 同步令牌实现机制研究
同步令牌机制是一种通过对服务器端令牌与客户端令牌进行校验,通过校验结果是否一致来决定请求是否通过的机制,其中包括初始化令牌、校验令牌、销毁令牌等步骤.下面使用MVC模型(视图、控制器和模型)来说明令牌同步机制的核心工作原理.
MVC模型包括两个部分,业务处理逻辑和业务数据.模型中的视图层是指用户对系统直观认知的地方,表单等存放的地方.它由控制器生成和分发,可以向控制器发送请求信息,被控制器所管理[3].因此每一次的请求发送都会在视图发送,可以在此作出简单的校验.控制器是视图模块与模型模块两者之间的中枢,处理逻辑的地方,它响应视图的请求,收集视图提交的信息并进行处理.
在本文中,控制器响应视图接受请求时产生.令牌分别寄存在服务器端和客户端.服务端通过会话跟踪来管理,客户端利用表单的隐藏域来实现.
图2 令牌机制时序图
图2是令牌同步机制如何实现的时序图.用户从客户端向发出请求到控制器时(第一步),令牌就在控制器初始化生成,再把令牌存放在页面的隐藏字段和会话环境中(第二步),最后生成分发页面(第三步),反馈给用户(第四步),然后用户在客户端得到页面进行操作(第五步),填写完表单后再提交(第六步和第七步),控制器接受提交请求时,开始进行校验,首先将后台的令牌数据和页面中的隐藏域字段进行比较(第八步),如果令牌值一致(本时序图没有列出不一致情况,如果校验不相等应该调转页面至错误页面提示用户),最后控制器会把令牌销毁(第九步),然后执行业务逻辑处理用户请求(第十步和第十一步),处理完毕,把数据填装到模型(第十二步),然后在控制器进行重生生成令牌(第十三步),并让令牌同步(第十四步),最后根据业务逻辑定义生成页面(第十五步),反馈用户(第十六步).
4 表单重复提交的同步令牌解决方案实现
表单重复提交的同步令牌解决方案实现分为下四个步骤:
4.1 令牌初始化
为了防止表单重复提交,在每次提交请求的时候,都在在控制器生成和分发页面之前要对令牌进行初始化,每个令牌代表一个请求以区别不同的表单提交.其过程分为令牌生成和令牌同步.
为了每个生成的令牌是唯一的,可以通过GUID或者经过一定运算的时间戳来达到生成唯一的令牌.本文通过GUID而保证令牌值的唯一性.GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复.代码如下:
通过方法得到令牌,然后把令牌值保存在用户会话中,这样可以在客户端和服务端可以保证令牌的同步,具体实现如下:
令牌初始化完后,客户端和服务器就拥有了相同的令牌值.
4.2 令牌比较
因为每个令牌各不相同,所以可以判断2次提交是否相同请求.因此在处理用户的请求时,就要在处理器里进行令牌比较,验证用户携带的令牌值与存放在Session中的令牌值是否一致,如果令牌匹配成功则进行业务逻辑操作,匹配不成功则不进行业务逻辑操作,如图3.在下列情况下,表明客户端和服务器端的令牌值不同:
(1)在客户端中检测不到令牌(令牌值为空);
(2)存放在会话中的令牌变量为不存在;
(3)页面与服务端的令牌不匹配.
令牌比较函数的代码如下:
以上
图3 令牌比较
4.3 令牌销毁
在令牌比较完成后,客户端有新的请求时应该进行令牌的销毁,否则当用户的新请求发送到控制器时,令牌还没有被控制器销毁,控制器的令牌与之匹配,这样就会重复执行业务逻辑.
因为令牌是存放在会话当中,所以只要把会话的变量设置为空并覆盖即可.session.setAttribute("test_token",null).
4.4 重新生成令牌
每当用户发送请求到控制器,控制器处理完用户的请求后,就必须重新生成令牌,达到令牌同步.如此,系统才允许接受用户提交请求[4].在代码的实现上,该过程和令牌初始化是一样的,因此不再重复.但是令牌机制在这里只是现在同一标的在当前会话期间多次提交的一种限制方法,还需要在多个方面改进,如:
(1)从客户端上进行限制检测用户录入数据合法性,使不法数据可以通过系统回退,修改正确后才能提交表单.
(2)因为令牌在会话环境中生成,因此比较令牌不能在多个会话中进行比较,所以如果要限制到多会话,则需要用到数据库或Cookeis来保存相关数据了.
(3)本文的令牌机制主要防止用户误操作,不能防止刻意的攻击.
5 总结
本文对B/S系统中经常出现的表单重复提交进行了分析和研究,通过引入同步令牌机制,解决了该问题.同时,分析了同步令牌制止的应用原理,并实现同步令牌在该系统中的应用,该方法对B/S系统的表单重复提交问题,具有一定的借鉴意义.
[1]朱国辉,周琪云,朱文生.Web应用中重复提交的探讨[J].计算机与现代化,2006(7):75-77.
[2]杨兵.令牌技术在Web项目中的研究与应用[J].计算机与现代化,2005(7):110-112.
[3]HARTMAN BRET,FLINN DONALD J.全面掌握Web服务安全性[M].北京:清华大学出版社,2004:6.
[4]谢凡.基于安全令牌的Web服务安全研究[D].北京:中国地质大学,2007:65.
Research and Application of Token Mechanism on Repeating Submission of Web Form in the B/S Application System
GAO He-fu
(Guangzhou Sunrise Electronic Technology Co.,Ltd,Guangzhou 510664,China)
This paper analyzes the reasons of repeating submission of web form in B/S structure applications,and in-depth study of core working principle and application process of synchronous token.It solves this problem through making the web form to avoid repeating submission through bringing the synchronous tokens through initializing token,checking the token,destroying token.Also,its implementation process was analyzed and elaborated.
web form;synchronous token
TP311.52
A
1007-6883(2011)06-0049-05
2011-11-16
广东省省部产学研结合项目(2010B090400149)资助.
高河福(1978-),男,福建安溪人,广州市森锐电子科技有限公司系统分析师.
责任编辑 尔 迟 杨培奎