我正在使用HTML,JQuery和PHP / MySQL。我在很大程度上理解,如果我想让这个游戏安全,那么服务器几乎需要做所有事情,但在某些情况下游戏必须告诉服务器做事。在我的例子中,这是一个RPG类型设置,它有时需要通过从数据库更新,插入或删除的Ajax调用向PHP脚本发送POST请求。比如一个玩家赢得一场战斗并且他的exp需要被追加,或者一个玩家在战斗中转弯,它需要计算出从另一个敌人身上取下的HP数量并将其返回以及更新敌人的HP
让我们说当玩家点击“攻击”并运行一个名为playerMove('attack')
的JavaScript函数时,是什么阻止用户进入他们的浏览器开发人员工具并手动运行此功能?或者在备用服务器上使用类似代码并运行跨站点Ajax调用我服务器上的相同公共脚本?
有没有解决这个问题的方法?即使我有一个作为客户端应用程序的游戏(如C#或其他),这些问题仍然不存在,但用户执行起来更难。或者如果正确完成,通过C#直接连接到MySQL是绝对安全的。但是,如果C#将POST请求发送到PHP脚本,那么这会不会让您回到问题,因为脚本是公开的,可以从其他来源发布它们?
答案 0 :(得分:3)
基本上,每次玩家“攻击”请求进入时,服务器都需要至少执行以下操作:
对请求中的数据进行基本验证。
检查主题播放器攻击请求是否来自正确的帐户。
检查玩家目前是否在战斗中,轮到他了,攻击的目标是有效的,玩家没有任何防止攻击的状态效果等等。任何游戏逻辑规定玩家可以现在不要攻击。
计算攻击效果。
更新数据库。
将结果返回给客户。
通过长轮询,WebSockets等将结果返回给所有其他客户端。
现在,如果玩家尝试在他们无法进行AJAX调用时,您的服务器验证应该阻止它。请记住,客户端是所有输入/输出,并且在JS和PHP之间没有大量代码重复的情况下无法执行任何游戏逻辑。
使用PHP制作游戏,特别是多人游戏,需要大量的开销和样板。老实说,我想考虑使用另一种语言/框架。例如,Meteor为您提供了很多这样的东西。客户端,服务器和数据库数据会自动同步。它还具有延迟补偿,因此客户端可以运行服务器代码以获得预期结果,然后在服务器最终响应时更新到实际结果。这会让你的游戏感觉它在实时工作,同时仍然让服务器对游戏逻辑发生了最后的发言权。