-3

好吧,我正在为游戏战斗武器设计一个反作弊。我想做的是用数据库“ping”程序,这样人们就不能简单地创建一个程序,让它看起来好像他们正在使用反作弊。

有没有办法“加密”或阻止其他人轻松模拟连接?我对 PHP 不是很好,到目前为止它是这样添加的:

public function Update()
    {
        $ign = $_GET['ign'];
        $timestamp = $_GET['uid'];
        $time = time();

        if(($time - 10 < $timestamp) && ($time + 10 > $timestamp))
        {
            $this->connection();
            $data = mysql_query("SELECT * FROM users WHERE ign = '{$ign}'");
            if(mysql_num_rows($data) > 0)
            {
                mysql_query("UPDATE users SET lastonline = '{$time}' WHERE ign = '{$ign}'");
            }
            else
            {
                mysql_query("INSERT INTO users (id, ign, lastonline) VALUES ( NULL, '{$ign}', '{$time}' ) ");
            }

            echo "Connected to database";
        }
        else
        {
            echo "Problem connecting";
        }
    }

我需要某种方法来保护它/使它难以快速破解。一旦破解,我可以轻松更改,希望这提供了足够的信息!

4

1 回答 1

1

首先,在这里你必须清理你的 SQL 输入。我建议使用带有 PDO 的准备(ext/mysql正在进行很远很远的旅程)。

$db = new PDO(<connection details>);
$prepare = $db->prepare("SELECT * FROM users WHERE ign = :ign");
// Tip: make sure you actually check the prepare worked before trying to execute.
$prepare->execute(array(":ign" => $ign));

等等。阅读参考手册

但是,如果您正在使用 mysql_* 并拒绝更改(尽管如果您在发布时将 PHP 更新到 5.5,您会E_DEPRECATED抛出),请使用mysql_real_escape_string并删除查询中的引号。


接下来,实际处理请求。

有几种方法可以做到这一点,但最安全(也是您应该采取的唯一选择)将是加密功能强大的东西,例如一次性密码或 OAuth。

生成凭据,并让游戏发送一个使用唯一生成的哈希签名的令牌,可能来自产品代码。这对于每个安装都应该是唯一的,并且应该生成能够被脚本验证的哈希值。

这是游戏公司不断研究的问题,但往往是徒劳的;任何认为值得花时间这样做的人都可以并且将会对您的游戏进行逆向工程。反作弊也一样。


尽管如此,请签署请求并包括:

  • 玩家在游戏中的名字
  • 可以通过某种方式验证的非常准确的时间戳。
  • 请求签名(加密安全)
  • 位置数据(对于禁止快速黑客很有用,但如果有人传送等,请注意误报)
  • 反作弊所要求的任何其他内容(您可能对此有一个规范)

此外,出于对游戏的热爱,不要进行 Punkbuster 风格的反作弊(也就是不要以僵尸网络风格的方式禁止请求;它可能会被滥用 source

最后,我可能会建议让专业的安全研究人员来审查所有内容。

于 2013-05-20T14:00:19.337 回答