停止连接被伪造?

时间:2013-05-20 13:24:10

标签: php encryption

好吧,我正在为游戏战斗武器设计一个反作弊行为。 我想要做的是用数据库'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";
        }
    }

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

1 个答案:

答案 0 :(得分:1)

首先,您必须清理SQL输入,这是非常必要的。我建议使用PDO准备(ext/mysqlgoing on a journey far, far away)。

$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));

等等。阅读reference manual

但是如果你使用的是mysql_ *并且拒绝改变(虽然如果你在发布时将PHP更新为5.5,那么你会抛出E_DEPRECATED),使用mysql_real_escape_string并删除引号在查询中。

<小时/> 接下来,实际处理请求。

有几种方法可以做到这一点,但最安全的(也是唯一应该选择的选项)可能是加密强大的东西,例如One Time Pad或OAuth。

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

这是游戏公司不断研究的问题,但它往往是徒劳的;任何觉得值得花时间的人都可以对你的游戏进行逆向设计。反作弊也是如此。

<小时/> 然而,签署请求并包括:

  • 玩家的游戏名称
  • 非常准确的时间戳,可以通过某种方式进行验证。
  • 请求签名(加密安全)
  • 位置数据(用于禁止速度跳跃,但如果有人传送,请注意误报等)
  • 反作弊所需的任何其他内容(您可能会有此规范)

另外,对于对游戏的热爱,不要做一个Punkbuster风格的反作弊(又名不要以僵尸网络式的方式禁止请求;它可能被滥用< / em> source

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