我正面临一个我无法解决的架构问题。我正在用PHP和Javascript开发一个小游戏,我需要保存用户的进度。现在,问题是PHP无法确定用户何时获得该级别:它是在Javascript中完成的。有没有办法在他赢得一个级别时保存用户的进度?
例如,当用户赢得等级1时,他获得对等级2的访问权。如果他试图在未完成前一等级的情况下访问等级2,则他被重定向到最后完成的等级。在我的控制器中,我正在执行以下操作:
if (1 !== $id) {
if ($app['session']->get('last_level') !== ($id - 1)) {
// redirect the user
}
}
现在我需要一种方法将 last_level 值存储到会话中,这是一个用户无法模拟的操作。
任何提示?
答案 0 :(得分:1)
您将要在服务器上执行不同的last_level
计算。这样,用户就无法破解JavaScript,并在特制表单上提交内容。因此,根据您的存储系统(KV存储,数据库,文本文件等),将该值放在那里,然后检索它。
Ajax可以帮助你,但没有必要。这取决于你的游戏设置方式。但如果他们完成了这个级别,就需要通知服务器。
答案 1 :(得分:1)
如果用户完成某个级别,然后继续在同一页面上执行其他工作:
然后,您可能希望Ajax在新级别实现后立即将新级别信息发送到服务器。因此:
使用Cookie存储您的php会话ID
从您的Javascript客户端,只要用户赢得新级别,就使用Ajax在您的服务器上调用php url。将新级别作为参数发送。可以使用POST或GET,无所谓。
php程序将在cookie中接收会话ID,并将新级别作为参数。 php程序将从会话ID中查找用户ID,然后将新级别存储在数据库中。
下次调用php程序的主url时,它将能够查找用户的级别。
如果用户按“下一步”按钮继续前进到下一级别: 使用Javascript而不是Ajax来更改“下一步”按钮的POST参数。
你使用POST而不是GET,因为看到foo.com/game?level=5的网址对于人们欺骗你的游戏来说太明显了。 POST不会在url中显示level参数。更高的安全性:添加校验和参数。
如果上述任何一项不明确,请在评论中或作为后续问题提出。
答案 2 :(得分:0)
如果您乐意接受javascript的话,表示该级别已经完成,那么只需从javascript设置一个cookie。
用户无法模拟的操作
抱歉 - 但是如果它是javascript,当它们完成关卡时就会停止,那么没有什么可以阻止用户伪造结果。