【发布时间】:2017-12-16 00:53:56
【问题描述】:
在 PHP 中工作时,为了避免重复提交表单,我曾经生成某种唯一的 id,将其存储到会话变量中,并在表单中具有 id,所以在提交时我可以比较值,重新生成那时的会话值。我从不认为这是一个很好的解决方案,但我从来没有想到/找到更好的解决方案。
现在,我正在做一个带有 PHP 后端 (Lumen) 的 Angular 前端,我正在努力想一个不涉及我写入数据库的解决方案。除非我误解了什么,否则我不能在 Angular 和 PHP 之间使用会话,对吗?所以这个解决方案行不通。我唯一能想到的另一件事是在数据库中有一个键/对值,但我从来没有完全理解如何防止像意外双击这样的重复,其中会话/数据库可能不会在第二次之前更新它的键提交开始处理。随着我对无状态系统的了解越来越多,感觉会话并不是放置这类东西的最佳场所?
总的来说,我在创建安全的后端系统以避免重复表单方面遇到了麻烦。使用 Angular,我始终可以通过防止单击按钮、触发 API 调用等来防止重复提交,但我也想添加后端保护,我很想听听专家是如何做到的。
【问题讨论】:
-
为什么需要后端保护来防止重复提交表单?是否发生了对安全至关重要的事情?对我来说,除了简单的客户端检查之外,这似乎不是人们应该真正关心的事情。
-
恕我直言,我认为这是客户端问题,为什么不只是在点击按钮后禁用它
-
这些和下面的答案都回答了我的问题:我的心态一直是,不要相信前端。但是在这种情况下,前端/后端不应该关心彼此在做什么。谢谢。
-
@RhoVisions 是的,就是这样。后端和前端不关心对方在做什么,也不应该如此。除此之外,这让一个后端服务于各种前端客户端。现在你有一个网络应用程序(角度)。稍后您可以添加移动应用程序:ionic、swift、java 等等。无论哪种方式,这些客户端都可以以完全相同的方式与您的后端 API 交互,并且由于您的后端并不关心前端在做什么(甚至它是谁),因此添加额外的客户端非常容易.
-
@RhoVisions 欢迎您。是的,你是对的,你永远不应该信任客户端,但是“重复提交表单”不被认为是来自客户端的恶意行为,它只是一个偶然发生的行为,比如点击按钮两次——甚至更多可能是客户打算多次提交相同的数据。您真正应该在后端关心的是诸如泛滥请求和机器人之类的事情。