防止无状态系统中的重复表单提交

时间:2017-07-11 19:50:01

标签: php laravel angular

在PHP中工作时,为了避免重复的表单提交,我曾经生成某种类型的唯一ID,将其存储到会话变量中,并在表单中包含id,因此在提交时我可以比较值,重新生成此时的会话值。我从未认为这是一个很好的解决方案,但我从来没有想过/找到更好的解决方案。

现在,我正在使用PHP后端(Lumen)进行Angular前端,我很难想到一个不涉及我写入数据库的解决方案。除非我误解了什么,否则我不能在Angular和PHP之间使用会话,对吧?所以这个解决方案不起作用。我能想到的唯一另一件事就是在数据库中有一个键/对值,但是我从来没有完全理解如何防止像意外双击之类的重复,其中会话/数据库可能不会在第二个之前更新它的键提交开始处理。而且,随着我对无状态系统的了解越来越多,感觉就像会话不是放置此类事物的最佳位置?

总的来说,我在创建安全的后端系统时遇到了麻烦,以避免重复的表单。使用angular,我总是可以通过阻止点击按钮,激活API调用等来防止重复提交,但我也想添加后端保护,我很想听听专家是如何做到的。< / p>

3 个答案:

答案 0 :(得分:2)

在大多数情况下,这应该在前端受到保护。后端保护解决方案取决于您对唯一请求的定义。您可以从共同使请求唯一的属性创建组合键。例如。电子邮件ID,请求ID或任何请求参数集

DB不会接受重复的密钥,您可以捕获异常并在前端正常处理它。

EG。通讯订阅请求申请 - 请求的唯一性由电子邮件地址和简报类型

决定

答案 1 :(得分:1)

我确信有办法破解它,但我认为简短的回答是你不想破解它。当您转换到拆分/前端时,您正在做的一件事是专门使您的API调用无状态。这是件好事!无国籍,缺乏会话等可以大大简化您的后端应用程序。简而言之,无国籍是你做这样事情的原因的一半。

如您所习惯的那样,防止双重提交肯定是您需要有状态应用程序才能完成的事情。因此,它现在只是前端应用程序的工作。

最好的办法是以全新的方式考虑您的申请。您的PHP后端处理无状态REST请求,因此如果它获得重复提交,则不是PHP的问题。在实践中,角度应该没有问题,确保没有提交重复项(在前端很容易防止它)。您的PHP后端确实需要确保它始终返回适当的响应。因此,例如在注册页面上,背靠背的重复注册请求将导致成功注册,然后注册失败,并显示“该电子邮件已存在”(或类似内容)的消息。否则,您的PHP后端无关紧要。我仍然可以完成它的工作。客户的工作是确保双重提交不会发生,或者如果确实存在冲突的答案。

在API调用中,无状态是一种理想的品质:如果你搞砸了,那么你的生活会更加艰难。

答案 2 :(得分:0)

逻辑很简单,只需禁用提交按钮并在表单提交时向用户显示加载器并再次启用该按钮并在从第一个API获得响应时隐藏加载器,并且您也可以清空表单字段。现在,如果用户再次使用相同的详细信息提交表单,您可以轻松访问旧的已保存数据并进行比较,并可以警告用户已经提交了字段。

如果您使用的是Angular 4或2,

[禁用],* ngIf或[隐藏],Observables将帮助

重置form formRef.reset() https://codecraft.tv/courses/angular/forms/submitting-and-resetting/

和角度1     ng-disabled,ng-if和HTTP promise将有所帮助 并重置表格   angularjs form reset error