PHP - 这是防止重新提交的好方法吗?

时间:2009-11-02 10:03:52

标签: php

这与阻止webform resubmission有关,但这次上下文是基于网络的RPG。在玩家击败怪物后,它会掉落一个物品。因此,我希望阻止用户点击后退按钮,或者保持刷新,以“欺骗”项目丢弃。

由于项目丢弃频繁,使用DB存储唯一的'drop-transaction-id'对我来说似乎是不可行的。我在下面招揽一个想法:

  1. 对于每次战斗,根据当前日期时间,用户ID创建唯一值,并将其存储到数据库和会话中。有可能给定用户标识,您可以获取值

  2. 如果会话中的值存在于数据库中,则“战斗”有效并允许用户访问与战斗相关的所有页面。如果它在DB中不存在,则启动新的战斗状态

  3. 战斗结束后,将从DB中清除唯一值。

  4. 清除DB中30分钟的值。

  5. 欢迎对此方法提出任何意见,改进或陷阱

4 个答案:

答案 0 :(得分:3)

这个问题非常主观,你可以可以做或不能做的事情,具体取决于周围已有的数据/框架。

您提供的解决方案应该有效,但这取决于您可用的唯一战斗/战利品/用户数据。

我认为这是你认为最好的吗?这是我认为最好的:)。

  1. 获取用户ID,以及来自该战斗的唯一数据。战斗开始时间,战斗结束时间等等。
  2. 将其存储在数据库或您拥有的存储系统
  3. 收集战利品后,删除该记录
  4. 这样,如果那个userID和那个独特的战斗数据存在,他们就没有得到他们的战利品。

    你是对的;跟踪每一块战利品太多了,你最好暂时存储数据。

答案 1 :(得分:2)

似乎是一种合理的方法。我假设你存储的事实是玩家无论如何都在战斗中。否则,他们可以关闭浏览器,如果他们想避免战斗?

战斗结束和战利品掉落应被视为一种不正常的行动。如果没有战斗,就不会有任何掠夺战。

答案 2 :(得分:1)

这取决于你的游戏设计:你更倾向于roguelikes的方向,只有转数,因此在两次移动之间的长时间停顿肯定是可能的(比如通过聊天室咨询其他人,注意:在NetHack中不考虑作弊)?用户只能在某些地点或任何地方保存游戏吗?这在设计上产生了巨大的差异,例如为类似Thorarin提及的攻击让路。

如果你的游戏只有一次保存的传统roguelike路线,转动地下室和permadeath,那么就可以为任何给定角色保存当前回合的数量以及任何游戏相关信息(库存,地图,敌人)和他们的状态),然后在玩家的任何动作中检查,因此防止转弯两次。

答案 3 :(得分:-2)

或者你可以在客户端javascript中捆绑所有内容,这样即使他们确实重新提交了表单,也会产生一个全新的战斗/宝藏遭遇。