用于Javascript编写的游戏的服务器端高分

时间:2010-02-19 15:46:59

标签: javascript django

我正在用Javascript实现一个简单的游戏,并且我有兴趣拥有一个在线高分榜,以便玩家可以互相竞争。我对此有两个担忧:

  1. 为此目的,我需要的最简单的服务器端程序是什么?我不需要一个成熟的“Web应用程序”,只需要一些简单的东西就可以获得高分数的POST请求,更新数据库并发回分数列表。我熟悉Django。你有什么建议吗?
  2. 如何让highscores表格合理安全?我知道让它对抗有能力和专注的黑客很难,但我不希望任何能够访问Javascript源代码的人能够过于简单地提交虚构的分数。用于此目的的任何工具?

7 个答案:

答案 0 :(得分:5)

确保高分非常困难。我的意思是,确保它来自您的页面是不够的,因为如果JavaScript函数是submitHighScore(n),那么他们总是可以在该页面的地址栏中输入javascript:submitHighScore(10000000)并拥有它工作

我想到的可能是某种哈希函数,它会生成与游戏中某些级别相匹配的特定代码。提交分数时,它也会提交此哈希值,因此用户必须达到此级别才能获得相同的分数。

另一个选择是让游戏提供某种只能暂时起作用的密钥,这样当你按下密钥时会改变,然后分数会间歇性地提交给中央服务器。

请记住,真正确定的个人总是可以跟踪发送到您的数据的数据并对其进行反编译。

你可以去Broderbund路线并向玩家提出经过验证的琐事问题以确保他们确实通过了他们所说的水平......就像“上一级怪物的颜色是什么颜色?”

答案 1 :(得分:2)

要安全地提交分数,请签名(您还需要确保分数在签名和发送之前不会被伪造,但这是另一个问题)。

在JS代码中隐藏秘密,并将highscore + hash(highscore + secret)发送到服务器。哈希可以是MD5 / SHA1 - 很容易找到JS实现。

当然,任何人都不会仔细分析JS代码,但至少有人无法通过篡改HTTP流量来提交虚假的高分。

隐藏JS中的东西:

你不能真的隐藏它(它最终像DRM一样无用),但你可以努力模糊它并使调试变得痛苦。

  1. 不要将秘密作为文字放在源代码中 - 在运行时计算它,结合几个函数,本地和全局变量的结果。
  2. 缩小所有代码,删除源图。
  3. 添加一些代码,这些代码不做任何事情,但似乎很重要,以使调试更加混乱。
  4. 不要将任何东西放在全局范围内,而是通过传递闭包和数组来依赖共享的可变状态。
  5. 依赖于Date和计时器导致竞争条件使得代码在调试器中暂停时会产生错误的结果(只是不要让它太紧,不允许它在慢速机器上运行)。

  6. 如果游戏是确定性的(如拼图游戏),则用户可以以获取(用户输入)的步骤记录的形式提交高分,并在服务器上重放以计算分数。

    这会改变攻击,从发现/模拟分数提交功能到改变人工智能或攻击游戏本身,以便更容易玩(但仍然在其基本规则范围内)。

答案 2 :(得分:1)

1。)任何可以与数据库通信并理解JSON或您选择的其他格式的CGI脚本都可以完成这项工作。

但是,如果您熟悉Django,那么在Django之上构建服务器将是最简单的,就您必须学习的内容和您必须编写的应用程序代码而言。如果你从头开始编写,看似简单的CGI脚本会变得相当复杂。

我发现django-piston是一个方便的Django应用程序,可以快速编写REST风格的API服务器。它支持JSON,因此应该很容易与JavaScript游戏进行交互。

2。)最随意的破解者将使用replay attack及其变体:查看页面源并执行JavaScript函数,拦截HTTP请求并重新发送(使用Firefox附加组件应该很容易)像Tamper Data)。

要抵消前者,您可以混淆源代码和HTTP正文;

  • 缩小JavaScript代码
  • 使用Base64或其他编码算法对您发送到服务器的邮件进行编码

可以通过要求所有更新请求包括最近从服务器获取的一次性密码(Wikipedia article中的“会话令牌”)来阻止后者。

答案 3 :(得分:1)

我自己在想这个。对我来说似乎最合理的解决方案是:

1)会话,禁止篡改游戏外的得分表。

2)记录游戏中的每个动作并将其发送到乐谱服务器。然后,服务器将计算这些操作是否实际给出了这样的分数。如果您还记录了玩游戏所花费的时间,您可以进一步降低攻击者打扰自己足以打破游戏的机会。这也使您能够制作具有高分表的Arcade服务器等重放脚本,并且如果有可疑分数,您可以观看重播并自行决定分数是否真实。骗子必须使用一个聪明的机器人来玩你的游戏 - 除非你有一个真正的奖品游戏,没有人会努力尝试。

如果骗子甚至不会分析你的代码,那么会话就会阻止他。如果他读取你的代码,他会迅速打破任何类似于哈希分数,秘密,代币和任何东西的东西。但如果你让游戏记录脚本足够彻底,他就会放弃。

答案 4 :(得分:0)

回答你的问题:

1。)这取决于您的环境和编码偏好。 PHP,Python,ASP.NET是我想到的一些问题。感觉你已经知道Python(来自你的个人资料)你可以使用Python CGI脚本来做这个或者使用Python的许多框架之一(Zope,Django,Pylons,......)。

见:http://www.python.org/doc/essays/ppt/sd99east/index.htm 有关Python CGI的信息。

2。)安全性的一些技巧:(无或完全证明)

  • HTML中的隐藏文字框,其中包含服务器检查以匹配Cookie的编码值,以确保您的网页获得高分。
  • 服务器脚本仅接受来自特定域的值

答案 5 :(得分:0)

您可以使用上述方法之一的组合,以及只需要注册用户就可以发布高分。非注册用户可以查看他们当前的分数与现有的高分相比,但为了在线发布您的高分,您必须已经使用您的注册帐户登录,或者在应用程序在线更新分数时提供。

一条简单的信息,上面写着“你的高分是X,并在高分表中排名###。要在线发布这个分数,请先注册我们”。

答案 6 :(得分:0)

我认为更好的是将得分直接计算到你的django应用程序的python文件中。 而不是在javascript文件中计算它。您通过POST请求发送数据以与数据基础进行比较,然后计算得分并将其存储在数据基础中。像这样,您不会通过网络将分数传播到您的服务器。这是完全安全的,因为你只做本地的东西。