0%

如何防止表单重复提交

原因

网站中有很多地方都存在表单重复提交的问题,为了防止用户有意或者恶意的重复提交表单,都应该考虑设计防止表单重复提交的机制
要防止表单的重复提交,就要标识用户的每一次访问请求,使得每一次访问对于服务端来说都是唯一确定的,为了标识用户的每次访问请求,可以在用户请求的一个表单域增加一个隐藏表单项,这个表单项的值每次都是唯一的token,如:

1
2
3
<form id="form" method="post">
<input type=hidden name="crsf_token" value="****"/>
</form>

工作原理

当用户在请求时生成这个唯一的token(下面会讲如何生成,并且每次生成的token都不同),同时将这个token保存在用户的session中,等用户提交请求时检查这个token和当前的Session中保存的token是否一致,一致则认为是应该提交的表单,如果不一致则认为是多次重复提交的表单,则放弃该提交。

该图为请求表单页面的工作过程
微信截图_20200110163835.png

该图是提交表单时的工作流程
微信截图_20200110165042.png

token生成

生成唯一的token需要一个算法,最简单的就是可以根据一个种子作为key生成一个随机数