服务端防止重复提交

2018-11-25 10:21:52 +08:00
 wleexi

某个请求对应的是一个数据库的插入操作。从服务端角度来看,如何防止因为页面连续点击造成的重复提交。

7463 次点击
所在节点    程序员
37 条回复
checgg
2018-11-25 13:06:28 +08:00
这个问题的实际需求是什么?
1 防止提交两次?
这只能客户端去解决。

2 防止数据入库两次?
那么重复提交的定义是什么?
两个客户端,提交同一份数据,算重复提交吗?
如果算,设置数据库唯一索引就好,写入相同数据会失败。
如果不算,服务端没法验证。因为客户端请求都可以伪造。
dagger
2018-11-25 13:42:08 +08:00
你都说了是为了防止页面连续点击,那不去改前端的话,后端真的只能靠意念来感知了,就像前阵子那个要感知手机壳颜色一样
utoyuri
2018-11-25 13:55:11 +08:00
@wleexi 可以的 甚至明文都可以 只要唯一
reself
2018-11-25 14:07:48 +08:00
@wleexi 可以把 csrf ——这个场景也可以称为 token ——放到 header 里,就不用改表单了
TangMonk
2018-11-25 14:10:50 +08:00
@lihongjie0209

跨站请求伪造的 token 需要服务端来验证
reself
2018-11-25 14:11:23 +08:00
@lihongjie0209 本质是 token,只是顺带具有 csrf 的功能,表单只是实现方式,放表单,放 session,放 header,放 meta 都可以
TangMonk
2018-11-25 14:11:54 +08:00
可以用类似 csrf 的 token,并且在表单在提交了后 disable 掉
TangMonk
2018-11-25 14:12:32 +08:00
可以用类似 csrf 的 token,并且在表单在提交了后把体检按钮 disable 掉
TangMonk
2018-11-25 14:13:09 +08:00
体检按钮☞提交按钮
Vegetable
2018-11-25 14:22:00 +08:00
总之就是需要一个事务 id。csrf 的 token 功能和这个需求有一定的交叉,可以使用但是不完全匹配。
重复提交你说是连续点击,那么做个限速就好了,后几秒的请求丢弃就完了,用到缓存或者 session。这种需求前端配合禁用提交按钮好一点。
paicha
2018-11-25 14:33:33 +08:00
这是业务问题。
showecho
2018-11-25 19:38:17 +08:00
通常我是改前端,点击之后马上变为 disabled,这样就无法再次提交了,后端通常也有判断的逻辑,比如评论的话看时间间隔,注册的话比如邮箱唯一等;

这应该就可以解决了吧?
akira
2018-11-25 22:53:22 +08:00
@utoyuri 做个 3s 自动过期就好了,逻辑还简单点
utoyuri
2018-11-26 01:27:14 +08:00
@akira 很多个同样请求同时过来的时候 3s 过期时间就歇菜了
utoyuri
2018-11-26 01:53:25 +08:00
@akira 忽略我上一条弱智回复
yc8332
2018-11-26 09:16:03 +08:00
表单 token 或者是 session 控制,还有同一个用户的提交数据 sha1 一下,缓存个几秒(这个相当于加锁)。。。
Raymon111111
2018-11-26 11:46:38 +08:00
前端让按钮只能点一下是最好的

后端防恶意请求可以用 锁+数据库查询 的方法搞定幂等

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/511259

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX