Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在无状态系统中防止重复表单提交_Php_Laravel_Angular - Fatal编程技术网

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

Php 在无状态系统中防止重复表单提交,php,laravel,angular,Php,Laravel,Angular,在PHP中工作时,为了避免重复表单提交,我通常会生成某种类型的唯一id,将其存储到会话变量中,并将id保存在表单中,因此在提交时,我可以比较值,并在此时重新生成会话值。我从未认为这是一个很好的解决办法,但我从未想到/找到一个更好的解决办法 现在,我正在用一个PHP后端(Lumen)做一个有角度的前端,我正在努力想一个解决方案,它不需要我写入数据库。除非我有误解,否则我不能在Angular和PHP之间使用会话,对吗?所以这个解决方案行不通。我唯一能想到的另一件事是在数据库中有一个key/pair值

在PHP中工作时,为了避免重复表单提交,我通常会生成某种类型的唯一id,将其存储到会话变量中,并将id保存在表单中,因此在提交时,我可以比较值,并在此时重新生成会话值。我从未认为这是一个很好的解决办法,但我从未想到/找到一个更好的解决办法

现在,我正在用一个PHP后端(Lumen)做一个有角度的前端,我正在努力想一个解决方案,它不需要我写入数据库。除非我有误解,否则我不能在Angular和PHP之间使用会话,对吗?所以这个解决方案行不通。我唯一能想到的另一件事是在数据库中有一个key/pair值,但我一直不太明白如何防止像意外双击这样的重复,其中会话/数据库可能不会在第二次提交开始处理之前更新它的key。随着我对无状态系统的了解越来越多,我觉得会话不是放置这种东西的最佳场所


总的来说,我在创建一个安全的后端系统以避免重复表单方面遇到了麻烦。使用angular,我可以通过防止按钮被点击、API调用被触发等方式防止重复提交,但我也想添加后端保护,我很想听听专家们是如何做到的。

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

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


例如,时事通讯订阅请求应用程序-请求的唯一性由电子邮件地址和时事通讯类型决定

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

防止重复提交(正如您习惯的那样)显然是您需要有状态应用程序来完成的事情。因此,它现在完全是前端应用程序的工作

你最好用一种全新的方式来思考你的应用程序。您的PHP后端处理无状态REST请求,因此,如果收到重复提交,这不是PHP的问题。在实践中,angular应该可以确保不会提交副本(在前端很容易防止)。您的PHP后端确实需要确保它总是返回适当的响应。例如,在注册页面上,背对背的重复注册请求将导致成功注册,然后注册失败,并显示“该电子邮件已存在”(或类似信息)。否则,您的PHP后端就不在乎了。我仍然可以做它的工作。客户的工作是确保双重提交不会发生,或者如果发生了,则理解相互冲突的答案


在API调用中,无状态是一个令人满意的特性:如果你把它弄糟了,你的生活会变得更加困难。

逻辑很简单,只需禁用submit按钮并在form submit上向用户显示加载程序,然后再次启用该按钮,并在收到第一个API的响应时隐藏加载程序,还可以清空表单字段。现在,如果用户再次提交具有相同详细信息的表单,您可以轻松访问旧保存的数据并进行比较,还可以警告用户字段已提交

如果使用的是角度4或角度2

[disabled]、*ngIf或[hidden],可观察对象将有所帮助

重置表单formRef.reset()的步骤

角度1 ng已禁用,ng if和HTTP承诺将提供帮助 用于重置表单

为什么需要后端保护以防止重复提交表单?是否存在安全关键问题?对我来说,除了简单的客户端检查之外,这似乎不是一件应该真正关心的事情。我认为这是客户端的事情,为什么不在点击按钮后禁用按钮呢?这些和下面的答案都回答了我的问题:我的心态一直是,不要相信前端。但是在这种情况下,前端/后端不应该关心彼此在做什么。谢谢。@是的,就是这样。后端和前端不关心另一方在做什么,他们也不应该这样做。除此之外,这允许一个后端为各种前端客户机服务。现在你有了一个网络应用(angular)。以后你可以添加移动应用程序:爱奥尼亚、斯威夫特、java等等。无论哪种方式,这些客户机都可以以完全相同的方式与后端API交互,而且由于后端不关心前端在做什么(甚至不关心前端是谁),因此添加其他客户机是非常容易的。是的,你是对的,你永远不应该信任客户,但是“重复表单提交”并不被认为是客户有意的恶意行为,它只是一个偶然发生的行为,就像点击两次按钮一样,而且客户可能有意多次提交同一数据。在后端,您真正应该关心的是泛洪请求和机器人之类的事情。