服务端防止重复提交

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

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

7452 次点击
所在节点    程序员
37 条回复
leriou
2018-11-25 10:35:32 +08:00
csrf , 或者自己用事件 id 去重
utoyuri
2018-11-25 10:35:41 +08:00
根据 request 内容生成一个 unique key 塞到 redis,结束后删掉。接到新 request 后在 redis 里面找一下,存在就丢弃这个 request。
lihongjie0209
2018-11-25 10:37:58 +08:00
@leriou 跨站请求伪造 和 服务端有什么关系?
t6attack
2018-11-25 10:41:19 +08:00
参考眼前的页面。
<input type="hidden" value="xxxxx" name="once">
wleexi
2018-11-25 10:47:44 +08:00
@t6attack
@leriou

前端保持不变的情况下,单靠服务端来处理有什么办法么。
wleexi
2018-11-25 10:54:18 +08:00
@utoyuri 类似生成 md5 这种么。
Sharuru
2018-11-25 11:02:40 +08:00
PRG
allanzhuo
2018-11-25 11:08:38 +08:00
token
jugelizi
2018-11-25 11:08:39 +08:00
就是表单 token 啊 如果不是前后端分离的话
leriou
2018-11-25 11:11:30 +08:00
@wleexi 其实就是你需要能识别出来相同的请求, 做幂等处理, csrf 的原理是你每次前端的表单页面生成时候提供一个唯一的 csrf_id, 发起请求的时候这个 id 会跟着一起到达后端,标记本次请求, 如果后端发现这个 id 已经处理过一次了, 就说这次请求就是没有刷新页面情况下的重复的提交
wleexi
2018-11-25 11:15:40 +08:00
@jugelizi
@allanzhuo

有考虑过提交完成后把信息塞到 cookie 里,下一次提交如果 cookie 里发现有就不做插入。
如果提交是异步,前一次请求每完成,接着提交了第二次。。。也不能解决这个问题
godoway
2018-11-25 11:19:26 +08:00
@jugelizi 那么如果前后端分离怎么防止重复提交。
lihongjie0209
2018-11-25 11:21:14 +08:00
@leriou 前端保持不变的情况下 这个办法不可行, 你要改表单的逻辑
allanzhuo
2018-11-25 11:25:16 +08:00
@wleexi 我之前瞎写的,你可以参考下 https://www.cnblogs.com/laoyeye/p/9557269.html
allanzhuo
2018-11-25 11:26:53 +08:00
@allanzhuo 之前瞎写的一点思考,可以参考下
wleexi
2018-11-25 11:28:24 +08:00
@leriou 就是说还需要搞个地方存这个 id 对么。
allanzhuo
2018-11-25 11:30:42 +08:00
@wleexi 提交表单前先请求 token,提交的时候吧 token 带着,当个参数。
wleexi
2018-11-25 11:31:54 +08:00
@allanzhuo 意思懂,这样前端也要参与到改造中了,文章我看下,thx。
wleexi
2018-11-25 11:34:38 +08:00
@allanzhuo 如果塞到 cookie 里不就好了 ,就是刚才说的异步那个问题,
iyangyuan
2018-11-25 12:53:12 +08:00
直接把 token 放 cookie 里不就行了?

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

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

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

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

© 2021 V2EX