侠客的博客

略懂Html,Css,JavaScript,JQuery,Linux,PHP,Java,Vue,Python

表单hash有效阻止表单重复提交

问题的来源:
    很多程序员会遇到一个莫名其妙的问题,就是表单被重复提交,然后导致数据重复的情况。
问题来源场景:

    一般是在用户资金方面,或者网站的金额方面操作,会出现重复提交,到时资金金额为负数的情况。
    因为网络慢的问题,或者人为故意的,也有黑客洞悉bug,恶意操作,在短时间内向后台post、get数据。
问题的解决:
    1,利用数据库的联合唯一来解决

        以mysql为例:
        create table xaake_orders(

            id int auto_increment primary key,

            userid varchar(15) not null,

            orderid varchar(24) not null,

            ……

        ) engine = 'innodb' default charset = 'utf8';
        alter table xaake_orders add unique key user_order_unique (userid,orderid);

这种解决办法,只能拦截比较少的的一部分,因为只要随机一下orderid,解决不重复的问题的话,就轻松越过这个拦截了


    2,利用表锁解决

                每次操作数据库的时候,直接锁表,每操作一次,就锁表查询,主要是锁xaake_user表,查询余额是否充足,然后来更改订单状态

                这样操作的弊端:当用户量大的时候,会造成网络拥堵,用户体验极差

    3,也就是本文的重点

                利用表单hash来有效阻止重复提交

                在服务端生成一个hash,方法很多,生成的原则:绝对不能重复,方法就不罗列了,自己随意配置即可

                然后把这个hash写入到session,一定要写到后端,不能让用户随意更改,窥探

                然后把这个hash加入到表单中,使用<input type='hidden' value='hash'>,如果是ajax提交,则增加到data数据中

                当后端接收到数据的时候,第一步先验证hash值,如果hash值不能匹配的话,则拦截,每一次验证hash,不管成功与否都必须从session中销毁这个hash,然后重新刷新页面,重新提交


以上三个方法联合起来使用,问题就完美解决了。

发表评论:

©Copyright 2019 52400073.com Author by xaake,基于 Zblog