1

我的 XNA 游戏需要通过WebRequest一个 PHP 页面连接到我的网站,该页面检查用户的数据库并检查密码是否正确。

我已经有一个登录脚本,它将返回诸如“成功”“失败”之类的消息,显然这是暂时的,出于安全原因需要改进,它很容易被伪造。

C# 登录请求

    //Create the POST data
    ASCIIEncoding encoding = new ASCIIEncoding();
    string postData = "username=" + user + "&pass=" + pass;
    byte[] data = encoding.GetBytes(postData);

    //Make a request
    WebRequest request = WebRequest.Create("http://example.com/login.php");
    request.Method = "POST"; //We are posting the info
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = data.Length;

    //Open a stream, write into, then send it
    Stream stream = request.GetRequestStream();
    stream.Write(data, 0, data.Length);
    stream.Close();

    //Get response
    WebResponse response = request.GetResponse();
    stream = response.GetResponseStream();

    //Make a new stream, We will read from this
    StreamReader sr = new StreamReader(stream);
    string responseString = sr.ReadToEnd();

    //TODO: If the responseString says the client if authenticated, procede, if not, display error to user (Invalid password, etc)

而 PHP 脚本只是查找用户并比较提交的密码(所有这些都与 Joomla 站点数据库集成,因此用户拥有站点和游戏帐户)。

现在,我的 PHP 脚本如何发回可靠的身份验证方式,并提供某种令牌/ID,所以当我想提交例如高分时,它知道它来自该用户,并且是不是被伪造的吗?

4

2 回答 2

3

坦率地说,没有真正的方法可以确保您在 PHP 脚本中收到的数据实际上来自您的客户端。你能做的最好的事情就是让它变得更难。一定要小心你花多少时间在这上面,这是一口深井,那些想作弊的人会。

会话劫持仅涉及试图访问或操纵您的信息的第三方。对于游戏,这个第 3 方不关心你的高分,他们想要信用卡和密码。(密码是另一回事,但你非常需要 SSL)

根据您的描述,您主要关注作弊,基本上所有作弊都是第一方。玩家作弊。防止(大多数)作弊的唯一可靠方法是在您自己的系统上运行游戏并尽可能少地控制客户端(例如 EVE Online、暗黑破坏神 3,以及任何暴雪)。这通常很难实现,所以我会提出一些替代方案。

为了了解你的敌人,市面上有大量的记忆编辑工具。从注入功能到将您的资金从 100 更改为 999999,一切都可以完成。更改数值(如分数)需要大约 15 分钟,而且我不太擅长。

健全性检查。在您的 PHP 中,确保提交的分数确实有意义。假设你从客户那里得到的一切都是被操纵的。

朋克克星。向 Punkbuster 之类的公司付款,或在 Steam 上您可以(可能)使用 VAC 的地方下载您的游戏。这些工具不会公开它们的工作原理,而且 VAC 甚至有一个延迟禁止系统,因此您不知道是什么触发了它,但总的来说,它们监控内存变化和/或扫描已知的黑客攻击。

诚实。Pssh,是的,对(j/k)。大声笑,但真的:你相信你的朋友吗?考虑没有悲伤者的记分牌。

也许实施诸如基于季节的记分牌之类的东西?每 X 天,记分牌就会重置。这减少了作弊的动机。

差不多就是这样。你可以尝试混淆你的记忆值,它可能会阻止像我这样的人,但如果有人想要它足够糟糕并且知道足够多,他们将能够破解它并发布一个工具。

不过我会这样说:首先做一些值得黑客攻击的东西!如果人们经历了欺骗的努力,那是一个很好的迹象,你应该感到高兴。

于 2013-06-18T23:59:24.180 回答
0

你指的是一个Session Token. 会话令牌是在登录后给定时间段内对操作进行身份验证的好方法。您的 php 可以将会话令牌与用户名相关联,该用户名在给定时间后由服务器进程清除,此时用户必须再次登录。

于 2013-06-18T22:08:44.477 回答