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

Javascript编写游戏的服务器端高分,javascript,django,Javascript,Django,我正在用Javascript实现一个简单的游戏,我想为它提供一个在线高分表,这样玩家就可以互相竞争了。对此,我有两个担忧: 为此,我需要的最简单的服务器端程序是什么?我不需要一个成熟的“web应用程序”,只需要一个简单的程序,它可以获取高分的POST请求,更新数据库并发回分数列表。我对Django很熟悉。你有什么建议 如何使highscores表合理地安全?我知道,让它防弹对付有能力和有献身精神的黑客是很困难的,但我不希望任何能够访问Javascript源代码的人能够过于简单地提交虚构的分数。有

我正在用Javascript实现一个简单的游戏,我想为它提供一个在线高分表,这样玩家就可以互相竞争了。对此,我有两个担忧:

  • 为此,我需要的最简单的服务器端程序是什么?我不需要一个成熟的“web应用程序”,只需要一个简单的程序,它可以获取高分的POST请求,更新数据库并发回分数列表。我对Django很熟悉。你有什么建议
  • 如何使highscores表合理地安全?我知道,让它防弹对付有能力和有献身精神的黑客是很困难的,但我不希望任何能够访问Javascript源代码的人能够过于简单地提交虚构的分数。有用于此目的的工具吗

  • 回答你的问题:

    1.)这取决于您的环境和编码偏好。PHP、Python、ASP.NET是我想到的几个。感觉到您已经了解Python(从您的个人资料中),您可以使用Python CGI脚本来实现这一点,或者使用Python的众多框架之一(Zope、Django、Pylons等等)

    见: 有关Python CGI的信息

    2.)一些安全技巧:(无或完全证明)

    • HTML中带有编码值的隐藏文本框,服务器将检查该文本框以匹配cookie,以确保高分来自您的页面
    • 服务器脚本只接受来自特定域的值

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

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

    另一种选择是,游戏中引入某种只能暂时使用的密钥,这样,当你继续操作时,密钥会发生变化,然后分数会间歇性地提交给中央服务器

    请记住,真正有决心的人总是可以跟踪发送到数据的数据并对其进行反编译

    你可以走Broderbund路线,向玩家询问一些琐碎的问题,这些问题经过服务器端验证,以确保他们真的通过了他们所说的级别……比如“上一级别的怪物是什么颜色的?”

    1。)任何可以与数据库对话并理解JSON或其他格式的CGI脚本,我来做这项工作

    但是,如果您熟悉Django,那么在Django之上构建服务器将是最简单的,因为您需要学习什么以及需要编写多少应用程序代码。如果从头开始编写,看似简单的CGI脚本可能会变得相当复杂

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

    2.)最随意的破解者会选择a及其变体:查看页面源代码并执行JavaScript函数,拦截HTTP请求并重新发送(使用Firefox插件(如篡改数据)应该很容易

    为了抵消前者,您可以混淆源代码和HTTP主体

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

    后者可以通过要求所有更新请求包含最近从服务器获取的一次性密码(“中的会话令牌”)来防止。要安全提交分数,请签名(您还需要确保分数在签名和发送之前没有伪造,但这是另一个问题)

    在JS代码中隐藏一个秘密,并将
    highscore
    +
    hash(highscore+secret)
    发送到服务器。散列可以是MD5/SHA1——有容易找到的JS实现

    当然,它不会容忍任何人仔细分析JS代码,但至少有人不能仅仅通过篡改HTTP流量来提交虚假的高分

    关于在JS中隐藏内容: 你不能真的隐藏它(它和DRM一样最终是徒劳的),但你可以努力混淆它,让调试变得痛苦

  • 不要在源代码中把秘密当作文字——在运行时结合几个函数、局部变量和全局变量的结果进行计算
  • 缩小所有代码,删除源地图
  • 添加一些不起任何作用但似乎很重要的代码,以使调试更加混乱
  • 不要把任何东西放在全局范围内,而是通过传递闭包和数组来依赖共享的可变状态
  • 如果代码在调试器中暂停,则依赖日期和计时器导致竞争条件使代码产生错误的结果(只是不要使代码太紧,以允许它在低速机器上运行)

  • 如果游戏是确定性的(如益智游戏),那么用户可以提交高分,即获胜步骤日志(用户输入),您可以在服务器上重播以计算分数


    这将使攻击从查找/模拟分数提交功能转变为智能AI或破解游戏本身,使其更易于玩(但仍在其基本规则范围内)。

    您可以使用上述方法之一的组合,也可以简单地要求用户注册才能发布高分。非注册用户可以查看他们当前的分数与现有的高分进行比较,但为了在线发布你的高分,你必须已经使用注册帐户登录,或者在应用程序在线更新分数时提供该帐户

    一条简单的信息,大意是“你的高分是X,排名是###