将信息从javascript传递到php文件,同时限制用户自己执行?

将信息从javascript传递到php文件,同时限制用户自己执行?,php,javascript,ajax,Php,Javascript,Ajax,我正在制作一个游戏,其中战斗系统使用javascript进行战斗。战斗结束时,你要么赢,要么输。如果用户赢了,我需要用他们获得的XP更新mysql数据库 我能想到的最好的方法是,当用户成功发布addxp.php?amount=235之类的内容时,让javascript运行ajax函数,但如果我这样做,用户可以轻松查看源代码,并看到他们可以自己进入该页面更新自己的xp,而无需进行斗争。但这是我唯一知道怎么做的方法 请提供帮助:-/如果您依赖客户端web浏览器上运行的代码来更新作战结果,则您无法控制

我正在制作一个游戏,其中战斗系统使用javascript进行战斗。战斗结束时,你要么赢,要么输。如果用户赢了,我需要用他们获得的XP更新mysql数据库

我能想到的最好的方法是,当用户成功发布addxp.php?amount=235之类的内容时,让javascript运行ajax函数,但如果我这样做,用户可以轻松查看源代码,并看到他们可以自己进入该页面更新自己的xp,而无需进行斗争。但这是我唯一知道怎么做的方法


请提供帮助:-/

如果您依赖客户端web浏览器上运行的代码来更新作战结果,则您无法控制该代码。许多javascript和flash游戏的高分板依赖于浏览器发送高分注册,因此容易受到此攻击。没有真正简单的方法来解决这个问题

你可以试着把事情弄糊涂,但是有足够兴趣的人可以很容易地解决这个问题


正如knoopx在评论中提到的,唯一可靠的解决方法是在服务器端进行计算。例如,客户端浏览器将用户操作发送到服务器,服务器决定战斗结果,将结果插入mySQL数据库,并将结果发送回客户端。这显然是一个重大的体系结构变化,您必须决定是否值得。这是一个棘手的问题,不幸的是没有简单的解决方案。我可以给你一些建议,这些建议在我制作一款有现金奖励的flash游戏时对我很有帮助。这对我来说很有效,但再一次——这绝不是充分的证据

首先,考虑一下在给定的时间段内可能获得的最高分数。例如,你可以说,在玩了1分钟后,你可以得到的最高分数是200分

每次有人开始玩游戏时,您都会向服务器发送一个AJAX调用,以获取游戏ID。在设定的时间间隔(比如10秒)内,您会使用游戏ID和最新分数将游戏手机打到家中。这种方法唯一的作弊方法是创建一个脚本,该脚本定期与服务器联系,并且缓慢增加的分数低于最大值。这不是一件困难的事情,但至少现在我们进入了一个领域,我们已经用篡改数据和几分钟的时间来消除无聊

当你发回当前分数时,你可以做的另一件事是游戏板的当前状态。这对于现场抓取作弊者并没有多大用处,但它是一个非常好的工具,您可以在颁奖时使用它来检查高分是否是真实的。这给你的系统增加了另一层复杂性,希望能让一些稍微有点硬核的笨蛋感到无聊,并找到其他事情做

我的最后一个建议是——你绝不能让你的用户立即意识到你在做什么。也就是说,如果某人的分数低于你的高分/时间阈值,你就不会让他们知道他们绊倒了你的作弊检测器。在我创建的游戏中,我甚至记录了他们的高分和饼干。当从数据库中获取高分时,您可以从作弊=FALSE或cookie=userscookie的分数中选择*。这样,除非他们清除cookie并再次检查,否则(仅对他们而言)他们的黑客尝试似乎是成功的

哦,还有最后一件事;缩小你的javascript。这将混淆代码,使其很难阅读。同样,有足够决心的人可以很容易地绕过这一点,查看您的代码,但这一切都是为了让您的系统足够复杂,人们不会为此烦恼


不幸的是,网络的强项有时也可能是它的弱项。WWW的本质是源代码是开放的,任何人都可以阅读,这意味着对用户保密即使不是不可能,也是非常困难的。

唯一安全的方法是切换到服务器sideDrat。我想制作一个很棒的基于浏览器的RPG,它可以让你选择你的动作和素材,而不是仅仅点击“战斗”,然后它就可以帮你完成任务。。。除了flash,我想不出任何其他的方法,但我对flash不太在行:(另外,如果一个游戏错过了家里的电话或者需要很长时间才能回复,你可以将它标记为可疑。注意“需要很长时间才能回复”不过有一点。回答很好。不幸的是,我不认为这会对我的游戏起作用,因为没有真正的分数,只是赢了或输了当前的比赛。但这肯定让我觉得,如果我认为是跳出框框的话,我可以想出一些办法。你的RPG回合是基于回合还是实时的?回合,想想口袋妖怪或早期FF,或者这个specifily:赢得这场战斗的方式完全是基于逻辑的,还是有运气(随机性)的因素。